Wed, 16 Nov 2005 18:17:01 +0000
[gaim-migrate @ 14416]
" This patch implements a replacement for the queuing
system from 1.x. It also obsoletes a previous patch
[#1338873] I submitted to prioritize the unseen states
in gtk conversations.
The attached envelope.png is ripped from the
msgunread.png already included in gaim. It should be
dropped in the pixmaps directory (Makefile.am is
updated accordingly in this patch).
The two separate queuing preferences from 1.x, queuing
messages while away and queuing all new messages (from
docklet), are replaced with a single 3-way preference
for conversations. The new preference is "Hide new IM
conversations". This preference can be set to never,
away and always.
When a gtk conversation is created, it may be placed in
a hidden conversation window instead of being placed
normally. This decision is based upon the preference
and possibly the away state of the account the
conversation is being created for. This *will* effect
conversations the user explicitly requests to be
created, so in these cases the caller must be sure to
present the conversation to the user, using
gaim_gtkconv_present_conversation(). This is done
already in gtkdialogs.c which handles creating
conversations requested by the user from gaim proper
(menus, double-clicking on budy in blist, etc.).
The main advantage to not queuing messages is that the
conversations exist, the message is written to the
conversation (and logged if appropriate) and the unseen
state is set on the conversation. This means no
additional features are needed to track whether there
are queued messages or not, just use the unseen state
on conversations.
Since conversations may not be visible (messages
"queued"), gaim proper needs some notification that
there are messages waiting. I opted for a menutray icon
that shows up when an im conversation has an unseen
message. Clicking this icon will focus (and show if
hidden) the first conversation with an unseen message.
This is essentially the same behavior of the docklet in
cvs right now, except that the icon is only visible
when there is a conversation with an unread message.
The api that is added is flexible enough to allow
either the docklet or the new blist menutray icon to be
visible for conversations of any/all types and for
unseen messages >= any state. Currently they are set to
only IM conversations and only unseen states >= TEXT
(system messages and no log messages will not trigger
blinking the docklet or showing the blist tray icon),
but these could be made preferences relatively easily
in the future. Other plugins could probably benefit as
well: gaim_gtk_conversations_get_first_unseen().
There is probably some limit to comment size, so I'll
stop rambling now. If anyone has more
questions/comments, catch me in #gaim, here or on
gaim-devel."
committer: Luke Schierer <lschiere@pidgin.im>
| 10684 | 1 | /* |
| 2 | * gaim | |
| 3 | * | |
| 4 | * Gaim is the legal property of its developers, whose names are too numerous | |
| 5 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 6 | * source distribution. | |
| 7 | * | |
| 8 | * Original md5 | |
| 9 | * Copyright (C) 2001-2003 Christophe Devine <c.devine@cr0.net> | |
| 10 | * | |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
11 | * Original md4 taken from linux kernel |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
12 | * MD4 Message Digest Algorithm (RFC1320). |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
13 | * |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
14 | * Implementation derived from Andrew Tridgell and Steve French's |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
15 | * CIFS MD4 implementation, and the cryptoapi implementation |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
16 | * originally based on the public domain implementation written |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
17 | * by Colin Plumb in 1993. |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
18 | * |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
19 | * Copyright (c) Andrew Tridgell 1997-1998. |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
20 | * Modified by Steve French (sfrench@us.ibm.com) 2002 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
21 | * Copyright (c) Cryptoapi developers. |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
22 | * Copyright (c) 2002 David S. Miller (davem@redhat.com) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
23 | * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
24 | * |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
25 | * Original des taken from gpg |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
26 | * |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
27 | * des.c - DES and Triple-DES encryption/decryption Algorithm |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
28 | * Copyright (C) 1998 Free Software Foundation, Inc. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
29 | * |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
30 | * Please see below for more legal information! |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
31 | * |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
32 | * According to the definition of DES in FIPS PUB 46-2 from December 1993. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
33 | * For a description of triple encryption, see: |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
34 | * Bruce Schneier: Applied Cryptography. Second Edition. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
35 | * John Wiley & Sons, 1996. ISBN 0-471-12845-7. Pages 358 ff. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
36 | * |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
37 | * This file is part of GnuPG. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
38 | * |
| 10684 | 39 | * This program is free software; you can redistribute it and/or modify |
| 40 | * it under the terms of the GNU General Public License as published by | |
| 41 | * the Free Software Foundation; either version 2 of the License, or | |
| 42 | * (at your option) any later version. | |
| 43 | * | |
| 44 | * This program is distributed in the hope that it will be useful, | |
| 45 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 46 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 47 | * GNU General Public License for more details. | |
| 48 | * | |
| 49 | * You should have received a copy of the GNU General Public License | |
| 50 | * along with this program; if not, write to the Free Software | |
| 51 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 52 | */ | |
| 53 | #include <glib.h> | |
| 54 | #include <string.h> | |
| 55 | #include <stdio.h> | |
| 56 | ||
| 57 | #include "internal.h" | |
| 58 | #include "cipher.h" | |
| 59 | #include "debug.h" | |
| 60 | #include "signals.h" | |
| 61 | #include "value.h" | |
| 62 | ||
| 63 | /******************************************************************************* | |
| 64 | * MD5 | |
| 65 | ******************************************************************************/ | |
| 66 | struct MD5Context { | |
| 67 | guint32 total[2]; | |
| 68 | guint32 state[4]; | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
69 | guchar buffer[64]; |
| 10684 | 70 | }; |
| 71 | ||
| 72 | #define MD5_GET_GUINT32(n,b,i) { \ | |
| 73 | (n) = ((guint32)(b) [(i) ] ) \ | |
| 74 | | ((guint32)(b) [(i) + 1] << 8) \ | |
| 75 | | ((guint32)(b) [(i) + 2] << 16) \ | |
| 76 | | ((guint32)(b) [(i) + 3] << 24); \ | |
| 77 | } | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
78 | #define MD5_PUT_GUINT32(n,b,i) { \ |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
79 | (b)[(i) ] = (guchar)((n) ); \ |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
80 | (b)[(i) + 1] = (guchar)((n) >> 8); \ |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
81 | (b)[(i) + 2] = (guchar)((n) >> 16); \ |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
82 | (b)[(i) + 3] = (guchar)((n) >> 24); \ |
| 10684 | 83 | } |
| 84 | ||
| 85 | static void | |
| 86 | md5_init(GaimCipherContext *context, gpointer extra) { | |
| 87 | struct MD5Context *md5_context; | |
| 88 | ||
| 89 | md5_context = g_new0(struct MD5Context, 1); | |
| 90 | ||
| 91 | gaim_cipher_context_set_data(context, md5_context); | |
| 92 | ||
| 93 | gaim_cipher_context_reset(context, extra); | |
| 94 | } | |
| 95 | ||
| 96 | static void | |
| 97 | md5_reset(GaimCipherContext *context, gpointer extra) { | |
| 98 | struct MD5Context *md5_context; | |
| 99 | ||
| 100 | md5_context = gaim_cipher_context_get_data(context); | |
| 101 | ||
| 102 | md5_context->total[0] = 0; | |
| 103 | md5_context->total[1] = 0; | |
| 104 | ||
| 105 | md5_context->state[0] = 0x67452301; | |
| 106 | md5_context->state[1] = 0xEFCDAB89; | |
| 107 | md5_context->state[2] = 0x98BADCFE; | |
| 108 | md5_context->state[3] = 0x10325476; | |
| 109 | ||
| 110 | memset(md5_context->buffer, 0, sizeof(md5_context->buffer)); | |
| 111 | } | |
| 112 | ||
| 113 | static void | |
| 114 | md5_uninit(GaimCipherContext *context) { | |
| 115 | struct MD5Context *md5_context; | |
| 116 | ||
| 117 | gaim_cipher_context_reset(context, NULL); | |
| 118 | ||
| 119 | md5_context = gaim_cipher_context_get_data(context); | |
| 120 | memset(md5_context, 0, sizeof(md5_context)); | |
| 121 | ||
| 122 | g_free(md5_context); | |
| 123 | md5_context = NULL; | |
| 124 | } | |
| 125 | ||
| 126 | static void | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
127 | md5_process(struct MD5Context *md5_context, const guchar data[64]) { |
| 10684 | 128 | guint32 X[16], A, B, C, D; |
| 129 | ||
| 130 | A = md5_context->state[0]; | |
| 131 | B = md5_context->state[1]; | |
| 132 | C = md5_context->state[2]; | |
| 133 | D = md5_context->state[3]; | |
| 134 | ||
| 135 | MD5_GET_GUINT32(X[ 0], data, 0); | |
| 136 | MD5_GET_GUINT32(X[ 1], data, 4); | |
| 137 | MD5_GET_GUINT32(X[ 2], data, 8); | |
| 138 | MD5_GET_GUINT32(X[ 3], data, 12); | |
| 139 | MD5_GET_GUINT32(X[ 4], data, 16); | |
| 140 | MD5_GET_GUINT32(X[ 5], data, 20); | |
| 141 | MD5_GET_GUINT32(X[ 6], data, 24); | |
| 142 | MD5_GET_GUINT32(X[ 7], data, 28); | |
| 143 | MD5_GET_GUINT32(X[ 8], data, 32); | |
| 144 | MD5_GET_GUINT32(X[ 9], data, 36); | |
| 145 | MD5_GET_GUINT32(X[10], data, 40); | |
| 146 | MD5_GET_GUINT32(X[11], data, 44); | |
| 147 | MD5_GET_GUINT32(X[12], data, 48); | |
| 148 | MD5_GET_GUINT32(X[13], data, 52); | |
| 149 | MD5_GET_GUINT32(X[14], data, 56); | |
| 150 | MD5_GET_GUINT32(X[15], data, 60); | |
| 151 | ||
| 152 | #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) | |
| 153 | #define P(a,b,c,d,k,s,t) { \ | |
| 154 | a += F(b,c,d) + X[k] + t; \ | |
| 155 | a = S(a,s) + b; \ | |
| 156 | } | |
| 157 | ||
| 158 | /* first pass */ | |
| 159 | #define F(x,y,z) (z ^ (x & (y ^ z))) | |
| 160 | P(A, B, C, D, 0, 7, 0xD76AA478); | |
| 161 | P(D, A, B, C, 1, 12, 0xE8C7B756); | |
| 162 | P(C, D, A, B, 2, 17, 0x242070DB); | |
| 163 | P(B, C, D, A, 3, 22, 0xC1BDCEEE); | |
| 164 | P(A, B, C, D, 4, 7, 0xF57C0FAF); | |
| 165 | P(D, A, B, C, 5, 12, 0x4787C62A); | |
| 166 | P(C, D, A, B, 6, 17, 0xA8304613); | |
| 167 | P(B, C, D, A, 7, 22, 0xFD469501); | |
| 168 | P(A, B, C, D, 8, 7, 0x698098D8); | |
| 169 | P(D, A, B, C, 9, 12, 0x8B44F7AF); | |
| 170 | P(C, D, A, B, 10, 17, 0xFFFF5BB1); | |
| 171 | P(B, C, D, A, 11, 22, 0x895CD7BE); | |
| 172 | P(A, B, C, D, 12, 7, 0x6B901122); | |
| 173 | P(D, A, B, C, 13, 12, 0xFD987193); | |
| 174 | P(C, D, A, B, 14, 17, 0xA679438E); | |
| 175 | P(B, C, D, A, 15, 22, 0x49B40821); | |
| 176 | #undef F | |
| 177 | ||
| 178 | /* second pass */ | |
| 179 | #define F(x,y,z) (y ^ (z & (x ^ y))) | |
| 180 | P(A, B, C, D, 1, 5, 0xF61E2562); | |
| 181 | P(D, A, B, C, 6, 9, 0xC040B340); | |
| 182 | P(C, D, A, B, 11, 14, 0x265E5A51); | |
| 183 | P(B, C, D, A, 0, 20, 0xE9B6C7AA); | |
| 184 | P(A, B, C, D, 5, 5, 0xD62F105D); | |
| 185 | P(D, A, B, C, 10, 9, 0x02441453); | |
| 186 | P(C, D, A, B, 15, 14, 0xD8A1E681); | |
| 187 | P(B, C, D, A, 4, 20, 0xE7D3FBC8); | |
| 188 | P(A, B, C, D, 9, 5, 0x21E1CDE6); | |
| 189 | P(D, A, B, C, 14, 9, 0xC33707D6); | |
| 190 | P(C, D, A, B, 3, 14, 0xF4D50D87); | |
| 191 | P(B, C, D, A, 8, 20, 0x455A14ED); | |
| 192 | P(A, B, C, D, 13, 5, 0xA9E3E905); | |
| 193 | P(D, A, B, C, 2, 9, 0xFCEFA3F8); | |
| 194 | P(C, D, A, B, 7, 14, 0x676F02D9); | |
| 195 | P(B, C, D, A, 12, 20, 0x8D2A4C8A); | |
| 196 | #undef F | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
197 | |
| 10684 | 198 | /* third pass */ |
| 199 | #define F(x,y,z) (x ^ y ^ z) | |
| 200 | P(A, B, C, D, 5, 4, 0xFFFA3942); | |
| 201 | P(D, A, B, C, 8, 11, 0x8771F681); | |
| 202 | P(C, D, A, B, 11, 16, 0x6D9D6122); | |
| 203 | P(B, C, D, A, 14, 23, 0xFDE5380C); | |
| 204 | P(A, B, C, D, 1, 4, 0xA4BEEA44); | |
| 205 | P(D, A, B, C, 4, 11, 0x4BDECFA9); | |
| 206 | P(C, D, A, B, 7, 16, 0xF6BB4B60); | |
| 207 | P(B, C, D, A, 10, 23, 0xBEBFBC70); | |
| 208 | P(A, B, C, D, 13, 4, 0x289B7EC6); | |
| 209 | P(D, A, B, C, 0, 11, 0xEAA127FA); | |
| 210 | P(C, D, A, B, 3, 16, 0xD4EF3085); | |
| 211 | P(B, C, D, A, 6, 23, 0x04881D05); | |
| 212 | P(A, B, C, D, 9, 4, 0xD9D4D039); | |
| 213 | P(D, A, B, C, 12, 11, 0xE6DB99E5); | |
| 214 | P(C, D, A, B, 15, 16, 0x1FA27CF8); | |
| 215 | P(B, C, D, A, 2, 23, 0xC4AC5665); | |
| 216 | #undef F | |
| 217 | ||
| 218 | /* forth pass */ | |
| 219 | #define F(x,y,z) (y ^ (x | ~z)) | |
| 220 | P(A, B, C, D, 0, 6, 0xF4292244); | |
| 221 | P(D, A, B, C, 7, 10, 0x432AFF97); | |
| 222 | P(C, D, A, B, 14, 15, 0xAB9423A7); | |
| 223 | P(B, C, D, A, 5, 21, 0xFC93A039); | |
| 224 | P(A, B, C, D, 12, 6, 0x655B59C3); | |
| 225 | P(D, A, B, C, 3, 10, 0x8F0CCC92); | |
| 226 | P(C, D, A, B, 10, 15, 0xFFEFF47D); | |
| 227 | P(B, C, D, A, 1, 21, 0x85845DD1); | |
| 228 | P(A, B, C, D, 8, 6, 0x6FA87E4F); | |
| 229 | P(D, A, B, C, 15, 10, 0xFE2CE6E0); | |
| 230 | P(C, D, A, B, 6, 15, 0xA3014314); | |
| 231 | P(B, C, D, A, 13, 21, 0x4E0811A1); | |
| 232 | P(A, B, C, D, 4, 6, 0xF7537E82); | |
| 233 | P(D, A, B, C, 11, 10, 0xBD3AF235); | |
| 234 | P(C, D, A, B, 2, 15, 0x2AD7D2BB); | |
| 235 | P(B, C, D, A, 9, 21, 0xEB86D391); | |
| 236 | #undef F | |
| 237 | #undef P | |
| 238 | #undef S | |
| 239 | ||
| 240 | md5_context->state[0] += A; | |
| 241 | md5_context->state[1] += B; | |
| 242 | md5_context->state[2] += C; | |
| 243 | md5_context->state[3] += D; | |
| 244 | } | |
| 245 | ||
| 246 | static void | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
247 | md5_append(GaimCipherContext *context, const guchar *data, size_t len) { |
| 10684 | 248 | struct MD5Context *md5_context = NULL; |
| 249 | guint32 left = 0, fill = 0; | |
| 250 | ||
| 251 | g_return_if_fail(context != NULL); | |
| 252 | ||
| 253 | md5_context = gaim_cipher_context_get_data(context); | |
| 254 | g_return_if_fail(md5_context != NULL); | |
| 255 | ||
| 256 | left = md5_context->total[0] & 0x3F; | |
| 257 | fill = 64 - left; | |
| 258 | ||
| 259 | md5_context->total[0] += len; | |
| 260 | md5_context->total[0] &= 0xFFFFFFFF; | |
| 261 | ||
| 262 | if(md5_context->total[0] < len) | |
| 263 | md5_context->total[1]++; | |
| 264 | ||
| 265 | if(left && len >= fill) { | |
| 266 | memcpy((md5_context->buffer + left), data, fill); | |
| 267 | md5_process(md5_context, md5_context->buffer); | |
| 268 | len -= fill; | |
| 269 | data += fill; | |
| 270 | left = 0; | |
| 271 | } | |
| 272 | ||
| 273 | while(len >= 64) { | |
| 274 | md5_process(md5_context, data); | |
| 275 | len -= 64; | |
| 276 | data += 64; | |
| 277 | } | |
| 278 | ||
| 279 | if(len) { | |
| 280 | memcpy((md5_context->buffer + left), data, len); | |
| 281 | } | |
| 282 | } | |
| 283 | ||
| 284 | static gboolean | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
285 | md5_digest(GaimCipherContext *context, size_t in_len, guchar digest[16], |
| 10687 | 286 | size_t *out_len) |
| 287 | { | |
| 10684 | 288 | struct MD5Context *md5_context = NULL; |
| 289 | guint32 last, pad; | |
| 290 | guint32 high, low; | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
291 | guchar message[8]; |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
292 | guchar padding[64] = { |
| 10684 | 293 | 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 294 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 295 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 296 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | |
| 297 | }; | |
| 298 | ||
| 10687 | 299 | g_return_val_if_fail(in_len >= 16, FALSE); |
| 10684 | 300 | |
| 301 | md5_context = gaim_cipher_context_get_data(context); | |
| 302 | ||
| 303 | high = (md5_context->total[0] >> 29) | |
| 304 | | (md5_context->total[1] << 3); | |
| 305 | low = (md5_context->total[0] << 3); | |
| 306 | ||
| 307 | MD5_PUT_GUINT32(low, message, 0); | |
| 308 | MD5_PUT_GUINT32(high, message, 4); | |
| 309 | ||
| 310 | last = md5_context->total[0] & 0x3F; | |
| 311 | pad = (last < 56) ? (56 - last) : (120 - last); | |
| 312 | ||
| 313 | md5_append(context, padding, pad); | |
| 314 | md5_append(context, message, 8); | |
| 315 | ||
| 316 | MD5_PUT_GUINT32(md5_context->state[0], digest, 0); | |
| 317 | MD5_PUT_GUINT32(md5_context->state[1], digest, 4); | |
| 318 | MD5_PUT_GUINT32(md5_context->state[2], digest, 8); | |
| 319 | MD5_PUT_GUINT32(md5_context->state[3], digest, 12); | |
| 320 | ||
| 10687 | 321 | if(out_len) |
| 322 | *out_len = 16; | |
| 323 | ||
| 10684 | 324 | return TRUE; |
| 325 | } | |
| 326 | ||
| 327 | static GaimCipherOps MD5Ops = { | |
| 328 | NULL, /* Set option */ | |
| 329 | NULL, /* Get option */ | |
| 330 | md5_init, /* init */ | |
| 331 | md5_reset, /* reset */ | |
| 332 | md5_uninit, /* uninit */ | |
| 333 | NULL, /* set iv */ | |
| 334 | md5_append, /* append */ | |
| 335 | md5_digest, /* digest */ | |
| 336 | NULL, /* encrypt */ | |
| 337 | NULL, /* decrypt */ | |
| 338 | NULL, /* set salt */ | |
| 339 | NULL, /* get salt size */ | |
| 340 | NULL, /* set key */ | |
| 341 | NULL /* get key size */ | |
| 342 | }; | |
| 343 | ||
| 344 | /******************************************************************************* | |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
345 | * MD4 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
346 | ******************************************************************************/ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
347 | #define MD4_DIGEST_SIZE 16 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
348 | #define MD4_HMAC_BLOCK_SIZE 64 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
349 | #define MD4_BLOCK_WORDS 16 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
350 | #define MD4_HASH_WORDS 4 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
351 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
352 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
353 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
354 | struct MD4_Context { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
355 | guint32 hash[MD4_HASH_WORDS]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
356 | guint32 block[MD4_BLOCK_WORDS]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
357 | guint64 byte_count; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
358 | }; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
359 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
360 | static inline guint32 lshift(guint32 x, unsigned int s) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
361 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
362 | x &= 0xFFFFFFFF; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
363 | return ((x << s) & 0xFFFFFFFF) | (x >> (32 - s)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
364 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
365 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
366 | static inline guint32 F(guint32 x, guint32 y, guint32 z) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
367 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
368 | return (x & y) | ((~x) & z); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
369 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
370 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
371 | static inline guint32 G(guint32 x, guint32 y, guint32 z) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
372 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
373 | return (x & y) | (x & z) | (y & z); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
374 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
375 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
376 | static inline guint32 H(guint32 x, guint32 y, guint32 z) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
377 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
378 | return x ^ y ^ z; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
379 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
380 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
381 | #define ROUND1(a,b,c,d,k,s) (a = lshift(a + F(b,c,d) + k, s)) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
382 | #define ROUND2(a,b,c,d,k,s) (a = lshift(a + G(b,c,d) + k + (guint32)0x5A827999,s)) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
383 | #define ROUND3(a,b,c,d,k,s) (a = lshift(a + H(b,c,d) + k + (guint32)0x6ED9EBA1,s)) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
384 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
385 | static inline void le32_to_cpu_array(guint32 *buf, unsigned int words) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
386 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
387 | while (words--) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
388 | *buf=GUINT_FROM_LE(*buf); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
389 | buf++; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
390 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
391 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
392 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
393 | static inline void cpu_to_le32_array(guint32 *buf, unsigned int words) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
394 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
395 | while (words--) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
396 | *buf=GUINT_TO_LE(*buf); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
397 | buf++; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
398 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
399 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
400 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
401 | static void md4_transform(guint32 *hash, guint32 const *in) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
402 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
403 | guint32 a, b, c, d; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
404 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
405 | a = hash[0]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
406 | b = hash[1]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
407 | c = hash[2]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
408 | d = hash[3]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
409 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
410 | ROUND1(a, b, c, d, in[0], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
411 | ROUND1(d, a, b, c, in[1], 7); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
412 | ROUND1(c, d, a, b, in[2], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
413 | ROUND1(b, c, d, a, in[3], 19); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
414 | ROUND1(a, b, c, d, in[4], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
415 | ROUND1(d, a, b, c, in[5], 7); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
416 | ROUND1(c, d, a, b, in[6], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
417 | ROUND1(b, c, d, a, in[7], 19); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
418 | ROUND1(a, b, c, d, in[8], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
419 | ROUND1(d, a, b, c, in[9], 7); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
420 | ROUND1(c, d, a, b, in[10], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
421 | ROUND1(b, c, d, a, in[11], 19); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
422 | ROUND1(a, b, c, d, in[12], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
423 | ROUND1(d, a, b, c, in[13], 7); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
424 | ROUND1(c, d, a, b, in[14], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
425 | ROUND1(b, c, d, a, in[15], 19); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
426 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
427 | ROUND2(a, b, c, d,in[ 0], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
428 | ROUND2(d, a, b, c, in[4], 5); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
429 | ROUND2(c, d, a, b, in[8], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
430 | ROUND2(b, c, d, a, in[12], 13); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
431 | ROUND2(a, b, c, d, in[1], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
432 | ROUND2(d, a, b, c, in[5], 5); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
433 | ROUND2(c, d, a, b, in[9], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
434 | ROUND2(b, c, d, a, in[13], 13); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
435 | ROUND2(a, b, c, d, in[2], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
436 | ROUND2(d, a, b, c, in[6], 5); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
437 | ROUND2(c, d, a, b, in[10], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
438 | ROUND2(b, c, d, a, in[14], 13); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
439 | ROUND2(a, b, c, d, in[3], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
440 | ROUND2(d, a, b, c, in[7], 5); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
441 | ROUND2(c, d, a, b, in[11], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
442 | ROUND2(b, c, d, a, in[15], 13); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
443 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
444 | ROUND3(a, b, c, d,in[ 0], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
445 | ROUND3(d, a, b, c, in[8], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
446 | ROUND3(c, d, a, b, in[4], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
447 | ROUND3(b, c, d, a, in[12], 15); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
448 | ROUND3(a, b, c, d, in[2], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
449 | ROUND3(d, a, b, c, in[10], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
450 | ROUND3(c, d, a, b, in[6], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
451 | ROUND3(b, c, d, a, in[14], 15); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
452 | ROUND3(a, b, c, d, in[1], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
453 | ROUND3(d, a, b, c, in[9], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
454 | ROUND3(c, d, a, b, in[5], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
455 | ROUND3(b, c, d, a, in[13], 15); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
456 | ROUND3(a, b, c, d, in[3], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
457 | ROUND3(d, a, b, c, in[11], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
458 | ROUND3(c, d, a, b, in[7], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
459 | ROUND3(b, c, d, a, in[15], 15); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
460 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
461 | hash[0] += a; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
462 | hash[1] += b; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
463 | hash[2] += c; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
464 | hash[3] += d; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
465 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
466 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
467 | static inline void md4_transform_helper(struct MD4_Context *ctx) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
468 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
469 | le32_to_cpu_array(ctx->block, sizeof(ctx->block) / sizeof(guint32)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
470 | md4_transform(ctx->hash, ctx->block); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
471 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
472 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
473 | static void |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
474 | md4_init(GaimCipherContext *context, gpointer extra) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
475 | struct MD4_Context *mctx; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
476 | mctx = g_new0(struct MD4_Context, 1); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
477 | gaim_cipher_context_set_data(context, mctx); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
478 | gaim_cipher_context_reset(context, extra); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
479 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
480 | mctx->hash[0] = 0x67452301; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
481 | mctx->hash[1] = 0xefcdab89; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
482 | mctx->hash[2] = 0x98badcfe; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
483 | mctx->hash[3] = 0x10325476; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
484 | mctx->byte_count = 0; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
485 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
486 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
487 | static void |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
488 | md4_reset(GaimCipherContext *context, gpointer extra) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
489 | struct MD4_Context *mctx; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
490 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
491 | mctx = gaim_cipher_context_get_data(context); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
492 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
493 | mctx->hash[0] = 0x67452301; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
494 | mctx->hash[1] = 0xefcdab89; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
495 | mctx->hash[2] = 0x98badcfe; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
496 | mctx->hash[3] = 0x10325476; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
497 | mctx->byte_count = 0; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
498 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
499 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
500 | static void |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
501 | md4_append(GaimCipherContext *context, const guchar *data, size_t len) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
502 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
503 | struct MD4_Context *mctx = gaim_cipher_context_get_data(context); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
504 | const guint32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
505 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
506 | mctx->byte_count += len; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
507 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
508 | if (avail > len) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
509 | memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
510 | data, len); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
511 | return; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
512 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
513 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
514 | memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
515 | data, avail); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
516 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
517 | md4_transform_helper(mctx); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
518 | data += avail; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
519 | len -= avail; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
520 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
521 | while (len >= sizeof(mctx->block)) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
522 | memcpy(mctx->block, data, sizeof(mctx->block)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
523 | md4_transform_helper(mctx); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
524 | data += sizeof(mctx->block); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
525 | len -= sizeof(mctx->block); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
526 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
527 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
528 | memcpy(mctx->block, data, len); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
529 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
530 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
531 | static gboolean |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
532 | md4_digest(GaimCipherContext *context, size_t in_len, guchar *out, |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
533 | size_t *out_len) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
534 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
535 | struct MD4_Context *mctx = gaim_cipher_context_get_data(context); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
536 | const unsigned int offset = mctx->byte_count & 0x3f; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
537 | char *p = (char *)mctx->block + offset; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
538 | int padding = 56 - (offset + 1); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
539 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
540 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
541 | if(in_len<16) return FALSE; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
542 | if(out_len) *out_len = 16; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
543 | *p++ = 0x80; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
544 | if (padding < 0) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
545 | memset(p, 0x00, padding + sizeof (guint64)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
546 | md4_transform_helper(mctx); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
547 | p = (char *)mctx->block; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
548 | padding = 56; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
549 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
550 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
551 | memset(p, 0, padding); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
552 | mctx->block[14] = mctx->byte_count << 3; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
553 | mctx->block[15] = mctx->byte_count >> 29; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
554 | le32_to_cpu_array(mctx->block, (sizeof(mctx->block) - |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
555 | sizeof(guint64)) / sizeof(guint32)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
556 | md4_transform(mctx->hash, mctx->block); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
557 | cpu_to_le32_array(mctx->hash, sizeof(mctx->hash) / sizeof(guint32)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
558 | memcpy(out, mctx->hash, sizeof(mctx->hash)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
559 | memset(mctx, 0, sizeof(*mctx)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
560 | return TRUE; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
561 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
562 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
563 | static void |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
564 | md4_uninit(GaimCipherContext *context) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
565 | struct MD4_Context *md4_context; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
566 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
567 | gaim_cipher_context_reset(context, NULL); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
568 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
569 | md4_context = gaim_cipher_context_get_data(context); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
570 | memset(md4_context, 0, sizeof(md4_context)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
571 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
572 | g_free(md4_context); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
573 | md4_context = NULL; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
574 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
575 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
576 | static GaimCipherOps MD4Ops = { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
577 | NULL, /* Set option */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
578 | NULL, /* Get option */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
579 | md4_init, /* init */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
580 | md4_reset, /* reset */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
581 | md4_uninit, /* uninit */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
582 | NULL, /* set iv */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
583 | md4_append, /* append */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
584 | md4_digest, /* digest */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
585 | NULL, /* encrypt */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
586 | NULL, /* decrypt */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
587 | NULL, /* set salt */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
588 | NULL, /* get salt size */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
589 | NULL, /* set key */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
590 | NULL /* get key size */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
591 | }; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
592 | |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
593 | /****************************************************************************** |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
594 | * DES |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
595 | *****************************************************************************/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
596 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
597 | typedef struct _des_ctx |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
598 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
599 | guint32 encrypt_subkeys[32]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
600 | guint32 decrypt_subkeys[32]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
601 | } des_ctx[1]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
602 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
603 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
604 | * The s-box values are permuted according to the 'primitive function P' |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
605 | */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
606 | static guint32 sbox1[64] = |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
607 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
608 | 0x00808200, 0x00000000, 0x00008000, 0x00808202, 0x00808002, 0x00008202, 0x00000002, 0x00008000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
609 | 0x00000200, 0x00808200, 0x00808202, 0x00000200, 0x00800202, 0x00808002, 0x00800000, 0x00000002, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
610 | 0x00000202, 0x00800200, 0x00800200, 0x00008200, 0x00008200, 0x00808000, 0x00808000, 0x00800202, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
611 | 0x00008002, 0x00800002, 0x00800002, 0x00008002, 0x00000000, 0x00000202, 0x00008202, 0x00800000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
612 | 0x00008000, 0x00808202, 0x00000002, 0x00808000, 0x00808200, 0x00800000, 0x00800000, 0x00000200, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
613 | 0x00808002, 0x00008000, 0x00008200, 0x00800002, 0x00000200, 0x00000002, 0x00800202, 0x00008202, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
614 | 0x00808202, 0x00008002, 0x00808000, 0x00800202, 0x00800002, 0x00000202, 0x00008202, 0x00808200, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
615 | 0x00000202, 0x00800200, 0x00800200, 0x00000000, 0x00008002, 0x00008200, 0x00000000, 0x00808002 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
616 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
617 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
618 | static guint32 sbox2[64] = |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
619 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
620 | 0x40084010, 0x40004000, 0x00004000, 0x00084010, 0x00080000, 0x00000010, 0x40080010, 0x40004010, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
621 | 0x40000010, 0x40084010, 0x40084000, 0x40000000, 0x40004000, 0x00080000, 0x00000010, 0x40080010, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
622 | 0x00084000, 0x00080010, 0x40004010, 0x00000000, 0x40000000, 0x00004000, 0x00084010, 0x40080000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
623 | 0x00080010, 0x40000010, 0x00000000, 0x00084000, 0x00004010, 0x40084000, 0x40080000, 0x00004010, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
624 | 0x00000000, 0x00084010, 0x40080010, 0x00080000, 0x40004010, 0x40080000, 0x40084000, 0x00004000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
625 | 0x40080000, 0x40004000, 0x00000010, 0x40084010, 0x00084010, 0x00000010, 0x00004000, 0x40000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
626 | 0x00004010, 0x40084000, 0x00080000, 0x40000010, 0x00080010, 0x40004010, 0x40000010, 0x00080010, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
627 | 0x00084000, 0x00000000, 0x40004000, 0x00004010, 0x40000000, 0x40080010, 0x40084010, 0x00084000 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
628 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
629 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
630 | static guint32 sbox3[64] = |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
631 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
632 | 0x00000104, 0x04010100, 0x00000000, 0x04010004, 0x04000100, 0x00000000, 0x00010104, 0x04000100, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
633 | 0x00010004, 0x04000004, 0x04000004, 0x00010000, 0x04010104, 0x00010004, 0x04010000, 0x00000104, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
634 | 0x04000000, 0x00000004, 0x04010100, 0x00000100, 0x00010100, 0x04010000, 0x04010004, 0x00010104, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
635 | 0x04000104, 0x00010100, 0x00010000, 0x04000104, 0x00000004, 0x04010104, 0x00000100, 0x04000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
636 | 0x04010100, 0x04000000, 0x00010004, 0x00000104, 0x00010000, 0x04010100, 0x04000100, 0x00000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
637 | 0x00000100, 0x00010004, 0x04010104, 0x04000100, 0x04000004, 0x00000100, 0x00000000, 0x04010004, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
638 | 0x04000104, 0x00010000, 0x04000000, 0x04010104, 0x00000004, 0x00010104, 0x00010100, 0x04000004, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
639 | 0x04010000, 0x04000104, 0x00000104, 0x04010000, 0x00010104, 0x00000004, 0x04010004, 0x00010100 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
640 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
641 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
642 | static guint32 sbox4[64] = |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
643 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
644 | 0x80401000, 0x80001040, 0x80001040, 0x00000040, 0x00401040, 0x80400040, 0x80400000, 0x80001000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
645 | 0x00000000, 0x00401000, 0x00401000, 0x80401040, 0x80000040, 0x00000000, 0x00400040, 0x80400000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
646 | 0x80000000, 0x00001000, 0x00400000, 0x80401000, 0x00000040, 0x00400000, 0x80001000, 0x00001040, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
647 | 0x80400040, 0x80000000, 0x00001040, 0x00400040, 0x00001000, 0x00401040, 0x80401040, 0x80000040, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
648 | 0x00400040, 0x80400000, 0x00401000, 0x80401040, 0x80000040, 0x00000000, 0x00000000, 0x00401000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
649 | 0x00001040, 0x00400040, 0x80400040, 0x80000000, 0x80401000, 0x80001040, 0x80001040, 0x00000040, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
650 | 0x80401040, 0x80000040, 0x80000000, 0x00001000, 0x80400000, 0x80001000, 0x00401040, 0x80400040, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
651 | 0x80001000, 0x00001040, 0x00400000, 0x80401000, 0x00000040, 0x00400000, 0x00001000, 0x00401040 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
652 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
653 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
654 | static guint32 sbox5[64] = |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
655 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
656 | 0x00000080, 0x01040080, 0x01040000, 0x21000080, 0x00040000, 0x00000080, 0x20000000, 0x01040000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
657 | 0x20040080, 0x00040000, 0x01000080, 0x20040080, 0x21000080, 0x21040000, 0x00040080, 0x20000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
658 | 0x01000000, 0x20040000, 0x20040000, 0x00000000, 0x20000080, 0x21040080, 0x21040080, 0x01000080, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
659 | 0x21040000, 0x20000080, 0x00000000, 0x21000000, 0x01040080, 0x01000000, 0x21000000, 0x00040080, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
660 | 0x00040000, 0x21000080, 0x00000080, 0x01000000, 0x20000000, 0x01040000, 0x21000080, 0x20040080, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
661 | 0x01000080, 0x20000000, 0x21040000, 0x01040080, 0x20040080, 0x00000080, 0x01000000, 0x21040000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
662 | 0x21040080, 0x00040080, 0x21000000, 0x21040080, 0x01040000, 0x00000000, 0x20040000, 0x21000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
663 | 0x00040080, 0x01000080, 0x20000080, 0x00040000, 0x00000000, 0x20040000, 0x01040080, 0x20000080 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
664 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
665 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
666 | static guint32 sbox6[64] = |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
667 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
668 | 0x10000008, 0x10200000, 0x00002000, 0x10202008, 0x10200000, 0x00000008, 0x10202008, 0x00200000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
669 | 0x10002000, 0x00202008, 0x00200000, 0x10000008, 0x00200008, 0x10002000, 0x10000000, 0x00002008, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
670 | 0x00000000, 0x00200008, 0x10002008, 0x00002000, 0x00202000, 0x10002008, 0x00000008, 0x10200008, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
671 | 0x10200008, 0x00000000, 0x00202008, 0x10202000, 0x00002008, 0x00202000, 0x10202000, 0x10000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
672 | 0x10002000, 0x00000008, 0x10200008, 0x00202000, 0x10202008, 0x00200000, 0x00002008, 0x10000008, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
673 | 0x00200000, 0x10002000, 0x10000000, 0x00002008, 0x10000008, 0x10202008, 0x00202000, 0x10200000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
674 | 0x00202008, 0x10202000, 0x00000000, 0x10200008, 0x00000008, 0x00002000, 0x10200000, 0x00202008, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
675 | 0x00002000, 0x00200008, 0x10002008, 0x00000000, 0x10202000, 0x10000000, 0x00200008, 0x10002008 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
676 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
677 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
678 | static guint32 sbox7[64] = |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
679 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
680 | 0x00100000, 0x02100001, 0x02000401, 0x00000000, 0x00000400, 0x02000401, 0x00100401, 0x02100400, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
681 | 0x02100401, 0x00100000, 0x00000000, 0x02000001, 0x00000001, 0x02000000, 0x02100001, 0x00000401, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
682 | 0x02000400, 0x00100401, 0x00100001, 0x02000400, 0x02000001, 0x02100000, 0x02100400, 0x00100001, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
683 | 0x02100000, 0x00000400, 0x00000401, 0x02100401, 0x00100400, 0x00000001, 0x02000000, 0x00100400, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
684 | 0x02000000, 0x00100400, 0x00100000, 0x02000401, 0x02000401, 0x02100001, 0x02100001, 0x00000001, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
685 | 0x00100001, 0x02000000, 0x02000400, 0x00100000, 0x02100400, 0x00000401, 0x00100401, 0x02100400, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
686 | 0x00000401, 0x02000001, 0x02100401, 0x02100000, 0x00100400, 0x00000000, 0x00000001, 0x02100401, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
687 | 0x00000000, 0x00100401, 0x02100000, 0x00000400, 0x02000001, 0x02000400, 0x00000400, 0x00100001 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
688 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
689 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
690 | static guint32 sbox8[64] = |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
691 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
692 | 0x08000820, 0x00000800, 0x00020000, 0x08020820, 0x08000000, 0x08000820, 0x00000020, 0x08000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
693 | 0x00020020, 0x08020000, 0x08020820, 0x00020800, 0x08020800, 0x00020820, 0x00000800, 0x00000020, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
694 | 0x08020000, 0x08000020, 0x08000800, 0x00000820, 0x00020800, 0x00020020, 0x08020020, 0x08020800, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
695 | 0x00000820, 0x00000000, 0x00000000, 0x08020020, 0x08000020, 0x08000800, 0x00020820, 0x00020000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
696 | 0x00020820, 0x00020000, 0x08020800, 0x00000800, 0x00000020, 0x08020020, 0x00000800, 0x00020820, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
697 | 0x08000800, 0x00000020, 0x08000020, 0x08020000, 0x08020020, 0x08000000, 0x00020000, 0x08000820, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
698 | 0x00000000, 0x08020820, 0x00020020, 0x08000020, 0x08020000, 0x08000800, 0x08000820, 0x00000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
699 | 0x08020820, 0x00020800, 0x00020800, 0x00000820, 0x00000820, 0x00020020, 0x08000000, 0x08020800 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
700 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
701 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
702 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
703 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
704 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
705 | * * These two tables are part of the 'permuted choice 1' function. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
706 | * * In this implementation several speed improvements are done. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
707 | * */ |
|
11677
89c2ab8d2ebf
[gaim-migrate @ 13963]
Mark Doliner <markdoliner@pidgin.im>
parents:
11597
diff
changeset
|
708 | static guint32 leftkey_swap[16] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
709 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
710 | 0x00000000, 0x00000001, 0x00000100, 0x00000101, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
711 | 0x00010000, 0x00010001, 0x00010100, 0x00010101, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
712 | 0x01000000, 0x01000001, 0x01000100, 0x01000101, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
713 | 0x01010000, 0x01010001, 0x01010100, 0x01010101 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
714 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
715 | |
|
11677
89c2ab8d2ebf
[gaim-migrate @ 13963]
Mark Doliner <markdoliner@pidgin.im>
parents:
11597
diff
changeset
|
716 | static guint32 rightkey_swap[16] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
717 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
718 | 0x00000000, 0x01000000, 0x00010000, 0x01010000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
719 | 0x00000100, 0x01000100, 0x00010100, 0x01010100, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
720 | 0x00000001, 0x01000001, 0x00010001, 0x01010001, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
721 | 0x00000101, 0x01000101, 0x00010101, 0x01010101, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
722 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
723 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
724 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
725 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
726 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
727 | * Numbers of left shifts per round for encryption subkey schedule |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
728 | * To calculate the decryption key scheduling we just reverse the |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
729 | * ordering of the subkeys so we can omit the table for decryption |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
730 | * subkey schedule. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
731 | */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
732 | static guint8 encrypt_rotate_tab[16] = |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
733 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
734 | 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
735 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
736 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
737 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
738 | * Macro to swap bits across two words |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
739 | **/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
740 | #define DO_PERMUTATION(a, temp, b, offset, mask) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
741 | temp = ((a>>offset) ^ b) & mask; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
742 | b ^= temp; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
743 | a ^= temp<<offset; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
744 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
745 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
746 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
747 | * This performs the 'initial permutation' for the data to be encrypted or decrypted |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
748 | **/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
749 | #define INITIAL_PERMUTATION(left, temp, right) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
750 | DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
751 | DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
752 | DO_PERMUTATION(right, temp, left, 2, 0x33333333) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
753 | DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
754 | DO_PERMUTATION(left, temp, right, 1, 0x55555555) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
755 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
756 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
757 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
758 | * The 'inverse initial permutation' |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
759 | **/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
760 | #define FINAL_PERMUTATION(left, temp, right) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
761 | DO_PERMUTATION(left, temp, right, 1, 0x55555555) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
762 | DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
763 | DO_PERMUTATION(right, temp, left, 2, 0x33333333) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
764 | DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
765 | DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
766 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
767 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
768 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
769 | * A full DES round including 'expansion function', 'sbox substitution' |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
770 | * and 'primitive function P' but without swapping the left and right word. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
771 | **/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
772 | #define DES_ROUND(from, to, work, subkey) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
773 | work = ((from<<1) | (from>>31)) ^ *subkey++; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
774 | to ^= sbox8[ work & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
775 | to ^= sbox6[ (work>>8) & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
776 | to ^= sbox4[ (work>>16) & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
777 | to ^= sbox2[ (work>>24) & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
778 | work = ((from>>3) | (from<<29)) ^ *subkey++; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
779 | to ^= sbox7[ work & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
780 | to ^= sbox5[ (work>>8) & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
781 | to ^= sbox3[ (work>>16) & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
782 | to ^= sbox1[ (work>>24) & 0x3f ]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
783 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
784 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
785 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
786 | * Macros to convert 8 bytes from/to 32bit words |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
787 | **/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
788 | #define READ_64BIT_DATA(data, left, right) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
789 | left = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
790 | right = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
791 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
792 | #define WRITE_64BIT_DATA(data, left, right) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
793 | data[0] = (left >> 24) &0xff; data[1] = (left >> 16) &0xff; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
794 | data[2] = (left >> 8) &0xff; data[3] = left &0xff; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
795 | data[4] = (right >> 24) &0xff; data[5] = (right >> 16) &0xff; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
796 | data[6] = (right >> 8) &0xff; data[7] = right &0xff; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
797 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
798 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
799 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
800 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
801 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
802 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
803 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
804 | * des_key_schedule(): Calculate 16 subkeys pairs (even/odd) for |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
805 | * 16 encryption rounds. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
806 | * To calculate subkeys for decryption the caller |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
807 | * have to reorder the generated subkeys. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
808 | * |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
809 | * rawkey: 8 Bytes of key data |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
810 | * subkey: Array of at least 32 guint32s. Will be filled |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
811 | * with calculated subkeys. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
812 | * |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
813 | **/ |
| 11597 | 814 | static void |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
815 | des_key_schedule (const guint8 * rawkey, guint32 * subkey) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
816 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
817 | guint32 left, right, work; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
818 | int round; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
819 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
820 | READ_64BIT_DATA (rawkey, left, right) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
821 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
822 | DO_PERMUTATION (right, work, left, 4, 0x0f0f0f0f) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
823 | DO_PERMUTATION (right, work, left, 0, 0x10101010) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
824 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
825 | left = (leftkey_swap[(left >> 0) & 0xf] << 3) | (leftkey_swap[(left >> 8) & 0xf] << 2) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
826 | | (leftkey_swap[(left >> 16) & 0xf] << 1) | (leftkey_swap[(left >> 24) & 0xf]) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
827 | | (leftkey_swap[(left >> 5) & 0xf] << 7) | (leftkey_swap[(left >> 13) & 0xf] << 6) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
828 | | (leftkey_swap[(left >> 21) & 0xf] << 5) | (leftkey_swap[(left >> 29) & 0xf] << 4); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
829 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
830 | left &= 0x0fffffff; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
831 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
832 | right = (rightkey_swap[(right >> 1) & 0xf] << 3) | (rightkey_swap[(right >> 9) & 0xf] << 2) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
833 | | (rightkey_swap[(right >> 17) & 0xf] << 1) | (rightkey_swap[(right >> 25) & 0xf]) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
834 | | (rightkey_swap[(right >> 4) & 0xf] << 7) | (rightkey_swap[(right >> 12) & 0xf] << 6) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
835 | | (rightkey_swap[(right >> 20) & 0xf] << 5) | (rightkey_swap[(right >> 28) & 0xf] << 4); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
836 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
837 | right &= 0x0fffffff; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
838 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
839 | for (round = 0; round < 16; ++round) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
840 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
841 | left = ((left << encrypt_rotate_tab[round]) | (left >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
842 | right = ((right << encrypt_rotate_tab[round]) | (right >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
843 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
844 | *subkey++ = ((left << 4) & 0x24000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
845 | | ((left << 28) & 0x10000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
846 | | ((left << 14) & 0x08000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
847 | | ((left << 18) & 0x02080000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
848 | | ((left << 6) & 0x01000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
849 | | ((left << 9) & 0x00200000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
850 | | ((left >> 1) & 0x00100000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
851 | | ((left << 10) & 0x00040000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
852 | | ((left << 2) & 0x00020000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
853 | | ((left >> 10) & 0x00010000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
854 | | ((right >> 13) & 0x00002000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
855 | | ((right >> 4) & 0x00001000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
856 | | ((right << 6) & 0x00000800) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
857 | | ((right >> 1) & 0x00000400) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
858 | | ((right >> 14) & 0x00000200) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
859 | | (right & 0x00000100) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
860 | | ((right >> 5) & 0x00000020) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
861 | | ((right >> 10) & 0x00000010) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
862 | | ((right >> 3) & 0x00000008) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
863 | | ((right >> 18) & 0x00000004) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
864 | | ((right >> 26) & 0x00000002) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
865 | | ((right >> 24) & 0x00000001); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
866 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
867 | *subkey++ = ((left << 15) & 0x20000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
868 | | ((left << 17) & 0x10000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
869 | | ((left << 10) & 0x08000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
870 | | ((left << 22) & 0x04000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
871 | | ((left >> 2) & 0x02000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
872 | | ((left << 1) & 0x01000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
873 | | ((left << 16) & 0x00200000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
874 | | ((left << 11) & 0x00100000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
875 | | ((left << 3) & 0x00080000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
876 | | ((left >> 6) & 0x00040000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
877 | | ((left << 15) & 0x00020000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
878 | | ((left >> 4) & 0x00010000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
879 | | ((right >> 2) & 0x00002000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
880 | | ((right << 8) & 0x00001000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
881 | | ((right >> 14) & 0x00000808) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
882 | | ((right >> 9) & 0x00000400) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
883 | | ((right) & 0x00000200) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
884 | | ((right << 7) & 0x00000100) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
885 | | ((right >> 7) & 0x00000020) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
886 | | ((right >> 3) & 0x00000011) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
887 | | ((right << 2) & 0x00000004) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
888 | | ((right >> 21) & 0x00000002); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
889 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
890 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
891 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
892 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
893 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
894 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
895 | * Fill a DES context with subkeys calculated from a 64bit key. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
896 | * Does not check parity bits, but simply ignore them. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
897 | * Does not check for weak keys. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
898 | **/ |
| 11597 | 899 | static void |
| 900 | des_set_key (GaimCipherContext *context, guchar * key) | |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
901 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
902 | struct _des_ctx *ctx = gaim_cipher_context_get_data(context); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
903 | int i; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
904 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
905 | des_key_schedule (key, ctx->encrypt_subkeys); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
906 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
907 | for(i=0; i<32; i+=2) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
908 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
909 | ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[30-i]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
910 | ctx->decrypt_subkeys[i+1] = ctx->encrypt_subkeys[31-i]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
911 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
912 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
913 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
914 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
915 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
916 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
917 | * Electronic Codebook Mode DES encryption/decryption of data according |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
918 | * to 'mode'. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
919 | **/ |
| 11597 | 920 | static int |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
921 | des_ecb_crypt (struct _des_ctx *ctx, const guint8 * from, guint8 * to, int mode) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
922 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
923 | guint32 left, right, work; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
924 | guint32 *keys; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
925 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
926 | keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
927 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
928 | READ_64BIT_DATA (from, left, right) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
929 | INITIAL_PERMUTATION (left, work, right) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
930 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
931 | DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
932 | DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
933 | DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
934 | DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
935 | DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
936 | DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
937 | DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
938 | DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
939 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
940 | FINAL_PERMUTATION (right, work, left) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
941 | WRITE_64BIT_DATA (to, right, left) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
942 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
943 | return 0; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
944 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
945 | |
| 11597 | 946 | static gint |
| 947 | des_encrypt(GaimCipherContext *context, const guchar data[], | |
| 948 | size_t len, guchar output[], size_t *outlen) { | |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
949 | int offset = 0; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
950 | int i = 0; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
951 | int tmp; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
952 | guint8 buf[8] = {0,0,0,0,0,0,0,0}; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
953 | while(offset+8<=len) { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
954 | des_ecb_crypt(gaim_cipher_context_get_data(context), |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
955 | data+offset, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
956 | output+offset, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
957 | 0); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
958 | offset+=8; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
959 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
960 | *outlen = len; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
961 | if(offset<len) { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
962 | *outlen += len - offset; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
963 | tmp = offset; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
964 | while(tmp<len) { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
965 | buf[i++] = data[tmp]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
966 | tmp++; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
967 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
968 | des_ecb_crypt(gaim_cipher_context_get_data(context), |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
969 | buf, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
970 | output+offset, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
971 | 0); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
972 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
973 | return 0; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
974 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
975 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
976 | static void |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
977 | des_init(GaimCipherContext *context, gpointer extra) { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
978 | struct _des_ctx *mctx; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
979 | mctx = g_new0(struct _des_ctx, 1); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
980 | gaim_cipher_context_set_data(context, mctx); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
981 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
982 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
983 | static void |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
984 | des_uninit(GaimCipherContext *context) { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
985 | struct _des_ctx *des_context; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
986 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
987 | des_context = gaim_cipher_context_get_data(context); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
988 | memset(des_context, 0, sizeof(des_context)); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
989 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
990 | g_free(des_context); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
991 | des_context = NULL; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
992 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
993 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
994 | static GaimCipherOps DESOps = { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
995 | NULL, /* Set option */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
996 | NULL, /* Get option */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
997 | des_init, /* init */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
998 | NULL, /* reset */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
999 | des_uninit, /* uninit */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1000 | NULL, /* set iv */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1001 | NULL, /* append */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1002 | NULL, /* digest */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1003 | des_encrypt, /* encrypt */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1004 | NULL, /* decrypt */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1005 | NULL, /* set salt */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1006 | NULL, /* get salt size */ |
| 11597 | 1007 | des_set_key, /* set key */ |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1008 | NULL /* get key size */ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1009 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1010 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1011 | |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
1012 | /******************************************************************************* |
| 10684 | 1013 | * SHA-1 |
| 1014 | ******************************************************************************/ | |
| 1015 | #define SHA1_ROTL(X,n) ((((X) << (n)) | ((X) >> (32-(n)))) & 0xFFFFFFFF) | |
| 1016 | ||
| 1017 | struct SHA1Context { | |
| 1018 | guint32 H[5]; | |
| 1019 | guint32 W[80]; | |
| 1020 | ||
| 1021 | gint lenW; | |
| 1022 | ||
| 1023 | guint32 sizeHi; | |
| 1024 | guint32 sizeLo; | |
| 1025 | }; | |
| 1026 | ||
| 1027 | static void | |
| 1028 | sha1_hash_block(struct SHA1Context *sha1_ctx) { | |
| 1029 | gint i; | |
| 1030 | guint32 A, B, C, D, E, T; | |
| 1031 | ||
| 1032 | for(i = 16; i < 80; i++) { | |
| 1033 | sha1_ctx->W[i] = SHA1_ROTL(sha1_ctx->W[i - 3] ^ | |
| 1034 | sha1_ctx->W[i - 8] ^ | |
| 1035 | sha1_ctx->W[i - 14] ^ | |
| 1036 | sha1_ctx->W[i - 16], 1); | |
| 1037 | } | |
| 1038 | ||
| 1039 | A = sha1_ctx->H[0]; | |
| 1040 | B = sha1_ctx->H[1]; | |
| 1041 | C = sha1_ctx->H[2]; | |
| 1042 | D = sha1_ctx->H[3]; | |
| 1043 | E = sha1_ctx->H[4]; | |
| 1044 | ||
| 1045 | for(i = 0; i < 20; i++) { | |
| 1046 | T = (SHA1_ROTL(A, 5) + (((C ^ D) & B) ^ D) + E + sha1_ctx->W[i] + 0x5A827999) & 0xFFFFFFFF; | |
| 1047 | E = D; | |
| 1048 | D = C; | |
| 1049 | C = SHA1_ROTL(B, 30); | |
| 1050 | B = A; | |
| 1051 | A = T; | |
| 1052 | } | |
| 1053 | ||
| 1054 | for(i = 20; i < 40; i++) { | |
| 1055 | T = (SHA1_ROTL(A, 5) + (B ^ C ^ D) + E + sha1_ctx->W[i] + 0x6ED9EBA1) & 0xFFFFFFFF; | |
| 1056 | E = D; | |
| 1057 | D = C; | |
| 1058 | C = SHA1_ROTL(B, 30); | |
| 1059 | B = A; | |
| 1060 | A = T; | |
| 1061 | } | |
| 1062 | ||
| 1063 | for(i = 40; i < 60; i++) { | |
| 1064 | T = (SHA1_ROTL(A, 5) + ((B & C) | (D & (B | C))) + E + sha1_ctx->W[i] + 0x8F1BBCDC) & 0xFFFFFFFF; | |
| 1065 | E = D; | |
| 1066 | D = C; | |
| 1067 | C = SHA1_ROTL(B, 30); | |
| 1068 | B = A; | |
| 1069 | A = T; | |
| 1070 | } | |
| 1071 | ||
| 1072 | for(i = 60; i < 80; i++) { | |
| 1073 | T = (SHA1_ROTL(A, 5) + (B ^ C ^ D) + E + sha1_ctx->W[i] + 0xCA62C1D6) & 0xFFFFFFFF; | |
| 1074 | E = D; | |
| 1075 | D = C; | |
| 1076 | C = SHA1_ROTL(B, 30); | |
| 1077 | B = A; | |
| 1078 | A = T; | |
| 1079 | } | |
| 1080 | ||
| 1081 | sha1_ctx->H[0] += A; | |
| 1082 | sha1_ctx->H[1] += B; | |
| 1083 | sha1_ctx->H[2] += C; | |
| 1084 | sha1_ctx->H[3] += D; | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1085 | sha1_ctx->H[4] += E; |
| 10684 | 1086 | } |
| 1087 | ||
| 1088 | static void | |
| 1089 | sha1_set_opt(GaimCipherContext *context, const gchar *name, void *value) { | |
| 1090 | struct SHA1Context *ctx; | |
| 1091 | ||
| 1092 | ctx = gaim_cipher_context_get_data(context); | |
| 1093 | ||
| 1094 | if(!strcmp(name, "sizeHi")) { | |
| 1095 | ctx->sizeHi = GPOINTER_TO_INT(value); | |
| 1096 | } else if(!strcmp(name, "sizeLo")) { | |
| 1097 | ctx->sizeLo = GPOINTER_TO_INT(value); | |
| 1098 | } else if(!strcmp(name, "lenW")) { | |
| 1099 | ctx->lenW = GPOINTER_TO_INT(value); | |
| 1100 | } | |
| 1101 | } | |
| 1102 | ||
| 1103 | static void * | |
| 1104 | sha1_get_opt(GaimCipherContext *context, const gchar *name) { | |
| 1105 | struct SHA1Context *ctx; | |
| 1106 | ||
| 1107 | ctx = gaim_cipher_context_get_data(context); | |
| 1108 | ||
| 1109 | if(!strcmp(name, "sizeHi")) { | |
| 1110 | return GINT_TO_POINTER(ctx->sizeHi); | |
| 1111 | } else if(!strcmp(name, "sizeLo")) { | |
| 1112 | return GINT_TO_POINTER(ctx->sizeLo); | |
| 1113 | } else if(!strcmp(name, "lenW")) { | |
| 1114 | return GINT_TO_POINTER(ctx->lenW); | |
| 1115 | } | |
| 1116 | ||
| 1117 | return NULL; | |
| 1118 | } | |
| 1119 | ||
| 1120 | static void | |
| 1121 | sha1_init(GaimCipherContext *context, void *extra) { | |
| 1122 | struct SHA1Context *sha1_ctx; | |
| 1123 | ||
| 1124 | sha1_ctx = g_new0(struct SHA1Context, 1); | |
| 1125 | ||
| 1126 | gaim_cipher_context_set_data(context, sha1_ctx); | |
| 1127 | ||
| 1128 | gaim_cipher_context_reset(context, extra); | |
| 1129 | } | |
| 1130 | ||
| 1131 | static void | |
| 1132 | sha1_reset(GaimCipherContext *context, void *extra) { | |
| 1133 | struct SHA1Context *sha1_ctx; | |
| 1134 | gint i; | |
| 1135 | ||
| 1136 | sha1_ctx = gaim_cipher_context_get_data(context); | |
| 1137 | ||
| 1138 | g_return_if_fail(sha1_ctx); | |
| 1139 | ||
| 1140 | sha1_ctx->lenW = 0; | |
| 1141 | sha1_ctx->sizeHi = 0; | |
| 1142 | sha1_ctx->sizeLo = 0; | |
| 1143 | ||
| 1144 | sha1_ctx->H[0] = 0x67452301; | |
| 1145 | sha1_ctx->H[1] = 0xEFCDAB89; | |
| 1146 | sha1_ctx->H[2] = 0x98BADCFE; | |
| 1147 | sha1_ctx->H[3] = 0x10325476; | |
| 1148 | sha1_ctx->H[4] = 0xC3D2E1F0; | |
| 1149 | ||
| 1150 | for(i = 0; i < 80; i++) | |
| 1151 | sha1_ctx->W[i] = 0; | |
| 1152 | } | |
| 1153 | ||
| 1154 | static void | |
| 1155 | sha1_uninit(GaimCipherContext *context) { | |
| 1156 | struct SHA1Context *sha1_ctx; | |
| 1157 | ||
| 1158 | gaim_cipher_context_reset(context, NULL); | |
| 1159 | ||
| 1160 | sha1_ctx = gaim_cipher_context_get_data(context); | |
| 1161 | ||
| 1162 | memset(sha1_ctx, 0, sizeof(struct SHA1Context)); | |
| 1163 | ||
| 1164 | g_free(sha1_ctx); | |
| 1165 | sha1_ctx = NULL; | |
| 1166 | } | |
| 1167 | ||
| 1168 | ||
| 1169 | static void | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1170 | sha1_append(GaimCipherContext *context, const guchar *data, size_t len) { |
| 10684 | 1171 | struct SHA1Context *sha1_ctx; |
| 1172 | gint i; | |
| 1173 | ||
| 1174 | sha1_ctx = gaim_cipher_context_get_data(context); | |
| 1175 | ||
| 1176 | g_return_if_fail(sha1_ctx); | |
| 1177 | ||
| 1178 | for(i = 0; i < len; i++) { | |
| 1179 | sha1_ctx->W[sha1_ctx->lenW / 4] <<= 8; | |
| 1180 | sha1_ctx->W[sha1_ctx->lenW / 4] |= data[i]; | |
| 1181 | ||
| 1182 | if((++sha1_ctx->lenW) % 64 == 0) { | |
| 1183 | sha1_hash_block(sha1_ctx); | |
| 1184 | sha1_ctx->lenW = 0; | |
| 1185 | } | |
| 1186 | ||
| 1187 | sha1_ctx->sizeLo += 8; | |
| 1188 | sha1_ctx->sizeHi += (sha1_ctx->sizeLo < 8); | |
| 1189 | } | |
| 1190 | } | |
| 1191 | ||
| 1192 | static gboolean | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1193 | sha1_digest(GaimCipherContext *context, size_t in_len, guchar digest[20], |
| 10687 | 1194 | size_t *out_len) |
| 1195 | { | |
| 10684 | 1196 | struct SHA1Context *sha1_ctx; |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1197 | guchar pad0x80 = 0x80, pad0x00 = 0x00; |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1198 | guchar padlen[8]; |
| 10684 | 1199 | gint i; |
| 1200 | ||
| 10687 | 1201 | g_return_val_if_fail(in_len >= 20, FALSE); |
| 10684 | 1202 | |
| 1203 | sha1_ctx = gaim_cipher_context_get_data(context); | |
| 1204 | ||
| 1205 | g_return_val_if_fail(sha1_ctx, FALSE); | |
| 1206 | ||
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1207 | padlen[0] = (guchar)((sha1_ctx->sizeHi >> 24) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1208 | padlen[1] = (guchar)((sha1_ctx->sizeHi >> 16) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1209 | padlen[2] = (guchar)((sha1_ctx->sizeHi >> 8) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1210 | padlen[3] = (guchar)((sha1_ctx->sizeHi >> 0) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1211 | padlen[4] = (guchar)((sha1_ctx->sizeLo >> 24) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1212 | padlen[5] = (guchar)((sha1_ctx->sizeLo >> 16) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1213 | padlen[6] = (guchar)((sha1_ctx->sizeLo >> 8) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1214 | padlen[7] = (guchar)((sha1_ctx->sizeLo >> 0) & 255); |
| 10684 | 1215 | |
| 1216 | /* pad with a 1, then zeroes, then length */ | |
| 1217 | gaim_cipher_context_append(context, &pad0x80, 1); | |
| 1218 | while(sha1_ctx->lenW != 56) | |
| 1219 | gaim_cipher_context_append(context, &pad0x00, 1); | |
| 1220 | gaim_cipher_context_append(context, padlen, 8); | |
| 1221 | ||
| 1222 | for(i = 0; i < 20; i++) { | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1223 | digest[i] = (guchar)(sha1_ctx->H[i / 4] >> 24); |
| 10684 | 1224 | sha1_ctx->H[i / 4] <<= 8; |
| 1225 | } | |
| 1226 | ||
| 1227 | gaim_cipher_context_reset(context, NULL); | |
| 1228 | ||
| 10687 | 1229 | if(out_len) |
| 1230 | *out_len = 20; | |
| 1231 | ||
| 10684 | 1232 | return TRUE; |
| 1233 | } | |
| 1234 | ||
| 1235 | static GaimCipherOps SHA1Ops = { | |
| 1236 | sha1_set_opt, /* Set Option */ | |
| 1237 | sha1_get_opt, /* Get Option */ | |
| 1238 | sha1_init, /* init */ | |
| 1239 | sha1_reset, /* reset */ | |
| 1240 | sha1_uninit, /* uninit */ | |
| 1241 | NULL, /* set iv */ | |
| 1242 | sha1_append, /* append */ | |
| 1243 | sha1_digest, /* digest */ | |
| 1244 | NULL, /* encrypt */ | |
| 1245 | NULL, /* decrypt */ | |
| 1246 | NULL, /* set salt */ | |
| 1247 | NULL, /* get salt size */ | |
| 1248 | NULL, /* set key */ | |
| 1249 | NULL /* get key size */ | |
| 1250 | }; | |
| 1251 | ||
| 1252 | /******************************************************************************* | |
| 1253 | * Structs | |
| 1254 | ******************************************************************************/ | |
| 1255 | struct _GaimCipher { | |
| 1256 | gchar *name; | |
| 1257 | GaimCipherOps *ops; | |
| 1258 | guint ref; | |
| 1259 | }; | |
| 1260 | ||
| 1261 | struct _GaimCipherContext { | |
| 1262 | GaimCipher *cipher; | |
| 1263 | gpointer data; | |
| 1264 | }; | |
| 1265 | ||
| 1266 | /****************************************************************************** | |
| 1267 | * Globals | |
| 1268 | *****************************************************************************/ | |
| 1269 | static GList *ciphers = NULL; | |
| 1270 | ||
| 1271 | /****************************************************************************** | |
| 1272 | * GaimCipher API | |
| 1273 | *****************************************************************************/ | |
| 1274 | const gchar * | |
| 1275 | gaim_cipher_get_name(GaimCipher *cipher) { | |
| 1276 | g_return_val_if_fail(cipher, NULL); | |
| 1277 | ||
| 1278 | return cipher->name; | |
| 1279 | } | |
| 1280 | ||
| 1281 | guint | |
| 1282 | gaim_cipher_get_capabilities(GaimCipher *cipher) { | |
| 1283 | GaimCipherOps *ops = NULL; | |
| 1284 | guint caps = 0; | |
| 1285 | ||
| 1286 | g_return_val_if_fail(cipher, 0); | |
| 1287 | ||
| 1288 | ops = cipher->ops; | |
| 1289 | g_return_val_if_fail(ops, 0); | |
| 1290 | ||
| 1291 | if(ops->set_option) | |
| 1292 | caps |= GAIM_CIPHER_CAPS_SET_OPT; | |
| 1293 | if(ops->get_option) | |
| 1294 | caps |= GAIM_CIPHER_CAPS_GET_OPT; | |
| 1295 | if(ops->init) | |
| 1296 | caps |= GAIM_CIPHER_CAPS_INIT; | |
| 1297 | if(ops->reset) | |
| 1298 | caps |= GAIM_CIPHER_CAPS_RESET; | |
| 1299 | if(ops->uninit) | |
| 1300 | caps |= GAIM_CIPHER_CAPS_UNINIT; | |
| 1301 | if(ops->set_iv) | |
| 1302 | caps |= GAIM_CIPHER_CAPS_SET_IV; | |
| 1303 | if(ops->append) | |
| 1304 | caps |= GAIM_CIPHER_CAPS_APPEND; | |
| 1305 | if(ops->digest) | |
| 1306 | caps |= GAIM_CIPHER_CAPS_DIGEST; | |
| 1307 | if(ops->encrypt) | |
| 1308 | caps |= GAIM_CIPHER_CAPS_ENCRYPT; | |
| 1309 | if(ops->decrypt) | |
| 1310 | caps |= GAIM_CIPHER_CAPS_DECRYPT; | |
| 1311 | if(ops->set_salt) | |
| 1312 | caps |= GAIM_CIPHER_CAPS_SET_SALT; | |
| 1313 | if(ops->get_salt_size) | |
| 1314 | caps |= GAIM_CIPHER_CAPS_GET_SALT_SIZE; | |
| 1315 | if(ops->set_key) | |
| 1316 | caps |= GAIM_CIPHER_CAPS_SET_KEY; | |
| 1317 | if(ops->get_key_size) | |
| 1318 | caps |= GAIM_CIPHER_CAPS_GET_KEY_SIZE; | |
| 1319 | ||
| 1320 | return caps; | |
| 1321 | } | |
| 1322 | ||
| 10687 | 1323 | gboolean |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1324 | gaim_cipher_digest_region(const gchar *name, const guchar *data, |
| 10687 | 1325 | size_t data_len, size_t in_len, |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1326 | guchar digest[], size_t *out_len) |
| 10684 | 1327 | { |
| 1328 | GaimCipher *cipher; | |
| 1329 | GaimCipherContext *context; | |
| 10687 | 1330 | gboolean ret = FALSE; |
| 10684 | 1331 | |
| 10687 | 1332 | g_return_val_if_fail(name, FALSE); |
| 1333 | g_return_val_if_fail(data, FALSE); | |
| 10684 | 1334 | |
| 1335 | cipher = gaim_ciphers_find_cipher(name); | |
| 1336 | ||
| 10687 | 1337 | g_return_val_if_fail(cipher, FALSE); |
| 10684 | 1338 | |
| 1339 | if(!cipher->ops->append || !cipher->ops->digest) { | |
| 1340 | gaim_debug_info("cipher", "gaim_cipher_region failed: " | |
| 1341 | "the %s cipher does not support appending and or " | |
| 1342 | "digesting.", cipher->name); | |
| 10687 | 1343 | return FALSE; |
| 10684 | 1344 | } |
| 1345 | ||
| 1346 | context = gaim_cipher_context_new(cipher, NULL); | |
| 1347 | gaim_cipher_context_append(context, data, data_len); | |
| 10687 | 1348 | ret = gaim_cipher_context_digest(context, in_len, digest, out_len); |
|
11143
f606fb334190
[gaim-migrate @ 13207]
Mark Doliner <markdoliner@pidgin.im>
parents:
10687
diff
changeset
|
1349 | gaim_cipher_context_destroy(context); |
| 10687 | 1350 | |
| 1351 | return ret; | |
| 10684 | 1352 | } |
| 1353 | ||
| 1354 | /****************************************************************************** | |
| 1355 | * GaimCiphers API | |
| 1356 | *****************************************************************************/ | |
| 1357 | GaimCipher * | |
| 1358 | gaim_ciphers_find_cipher(const gchar *name) { | |
| 1359 | GaimCipher *cipher; | |
| 1360 | GList *l; | |
| 1361 | ||
| 1362 | g_return_val_if_fail(name, NULL); | |
| 1363 | ||
| 1364 | for(l = ciphers; l; l = l->next) { | |
| 1365 | cipher = GAIM_CIPHER(l->data); | |
| 1366 | ||
| 1367 | if(!g_ascii_strcasecmp(cipher->name, name)) | |
| 1368 | return cipher; | |
| 1369 | } | |
| 1370 | ||
| 1371 | return NULL; | |
| 1372 | } | |
| 1373 | ||
| 1374 | GaimCipher * | |
| 1375 | gaim_ciphers_register_cipher(const gchar *name, GaimCipherOps *ops) { | |
| 1376 | GaimCipher *cipher = NULL; | |
| 1377 | ||
| 1378 | g_return_val_if_fail(name, NULL); | |
| 1379 | g_return_val_if_fail(ops, NULL); | |
| 1380 | g_return_val_if_fail(!gaim_ciphers_find_cipher(name), NULL); | |
| 1381 | ||
| 1382 | cipher = g_new0(GaimCipher, 1); | |
| 1383 | ||
| 1384 | cipher->name = g_strdup(name); | |
| 1385 | cipher->ops = ops; | |
| 1386 | ||
| 1387 | ciphers = g_list_append(ciphers, cipher); | |
| 1388 | ||
| 1389 | gaim_signal_emit(gaim_ciphers_get_handle(), "cipher-added", cipher); | |
| 1390 | ||
| 1391 | return cipher; | |
| 1392 | } | |
| 1393 | ||
| 1394 | gboolean | |
| 1395 | gaim_ciphers_unregister_cipher(GaimCipher *cipher) { | |
| 1396 | g_return_val_if_fail(cipher, FALSE); | |
| 1397 | g_return_val_if_fail(cipher->ref == 0, FALSE); | |
| 1398 | ||
| 1399 | gaim_signal_emit(gaim_ciphers_get_handle(), "cipher-removed", cipher); | |
| 1400 | ||
| 1401 | ciphers = g_list_remove(ciphers, cipher); | |
| 1402 | ||
| 1403 | g_free(cipher->name); | |
| 1404 | g_free(cipher); | |
| 1405 | ||
| 1406 | return TRUE; | |
| 1407 | } | |
| 1408 | ||
| 1409 | GList * | |
| 1410 | gaim_ciphers_get_ciphers() { | |
| 1411 | return ciphers; | |
| 1412 | } | |
| 1413 | ||
| 1414 | /****************************************************************************** | |
| 1415 | * GaimCipher Subsystem API | |
| 1416 | *****************************************************************************/ | |
| 1417 | gpointer | |
| 1418 | gaim_ciphers_get_handle() { | |
| 1419 | static gint handle; | |
| 1420 | ||
| 1421 | return &handle; | |
| 1422 | } | |
| 1423 | ||
| 1424 | void | |
| 1425 | gaim_ciphers_init() { | |
| 1426 | gpointer handle; | |
| 1427 | ||
| 1428 | handle = gaim_ciphers_get_handle(); | |
| 1429 | ||
| 1430 | gaim_signal_register(handle, "cipher-added", | |
| 1431 | gaim_marshal_VOID__POINTER, NULL, 1, | |
| 1432 | gaim_value_new(GAIM_TYPE_SUBTYPE, | |
| 1433 | GAIM_SUBTYPE_CIPHER)); | |
| 1434 | gaim_signal_register(handle, "cipher-removed", | |
| 1435 | gaim_marshal_VOID__POINTER, NULL, 1, | |
| 1436 | gaim_value_new(GAIM_TYPE_SUBTYPE, | |
| 1437 | GAIM_SUBTYPE_CIPHER)); | |
| 1438 | ||
| 1439 | gaim_ciphers_register_cipher("md5", &MD5Ops); | |
| 1440 | gaim_ciphers_register_cipher("sha1", &SHA1Ops); | |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
1441 | gaim_ciphers_register_cipher("md4", &MD4Ops); |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1442 | gaim_ciphers_register_cipher("des", &DESOps); |
| 10684 | 1443 | } |
| 1444 | ||
| 1445 | void | |
| 1446 | gaim_ciphers_uninit() { | |
| 1447 | GaimCipher *cipher; | |
| 1448 | GList *l, *ll; | |
| 1449 | ||
| 1450 | for(l = ciphers; l; l = ll) { | |
| 1451 | ll = l->next; | |
| 1452 | ||
| 1453 | cipher = GAIM_CIPHER(l->data); | |
| 1454 | gaim_ciphers_unregister_cipher(cipher); | |
| 1455 | ||
| 1456 | ciphers = g_list_remove(ciphers, cipher); | |
| 1457 | } | |
| 1458 | ||
| 1459 | g_list_free(ciphers); | |
| 1460 | ||
| 1461 | gaim_signals_unregister_by_instance(gaim_ciphers_get_handle()); | |
| 1462 | } | |
| 1463 | /****************************************************************************** | |
| 1464 | * GaimCipherContext API | |
| 1465 | *****************************************************************************/ | |
| 1466 | void | |
| 1467 | gaim_cipher_context_set_option(GaimCipherContext *context, const gchar *name, | |
| 1468 | gpointer value) | |
| 1469 | { | |
| 1470 | GaimCipher *cipher = NULL; | |
| 1471 | ||
| 1472 | g_return_if_fail(context); | |
| 1473 | g_return_if_fail(name); | |
| 1474 | ||
| 1475 | cipher = context->cipher; | |
| 1476 | g_return_if_fail(cipher); | |
| 1477 | ||
| 1478 | if(cipher->ops && cipher->ops->set_option) | |
| 1479 | cipher->ops->set_option(context, name, value); | |
| 1480 | else | |
| 1481 | gaim_debug_info("cipher", "the %s cipher does not support the " | |
| 1482 | "set_option operation\n", cipher->name); | |
| 1483 | } | |
| 1484 | ||
| 1485 | gpointer | |
| 1486 | gaim_cipher_context_get_option(GaimCipherContext *context, const gchar *name) { | |
| 1487 | GaimCipher *cipher = NULL; | |
| 1488 | ||
| 1489 | g_return_val_if_fail(context, NULL); | |
| 1490 | g_return_val_if_fail(name, NULL); | |
| 1491 | ||
| 1492 | cipher = context->cipher; | |
| 1493 | g_return_val_if_fail(cipher, NULL); | |
| 1494 | ||
| 1495 | if(cipher->ops && cipher->ops->get_option) | |
| 1496 | return cipher->ops->get_option(context, name); | |
| 1497 | else { | |
| 1498 | gaim_debug_info("cipher", "the %s cipher does not support the " | |
| 1499 | "get_option operation\n", cipher->name); | |
| 1500 | ||
| 1501 | return NULL; | |
| 1502 | } | |
| 1503 | } | |
| 1504 | ||
| 1505 | GaimCipherContext * | |
| 1506 | gaim_cipher_context_new(GaimCipher *cipher, void *extra) { | |
| 1507 | GaimCipherContext *context = NULL; | |
| 1508 | ||
| 1509 | g_return_val_if_fail(cipher, NULL); | |
| 1510 | ||
| 1511 | cipher->ref++; | |
| 1512 | ||
| 1513 | context = g_new0(GaimCipherContext, 1); | |
| 1514 | context->cipher = cipher; | |
| 1515 | ||
| 1516 | if(cipher->ops->init) | |
| 1517 | cipher->ops->init(context, extra); | |
| 1518 | ||
| 1519 | return context; | |
| 1520 | } | |
| 1521 | ||
| 1522 | GaimCipherContext * | |
| 1523 | gaim_cipher_context_new_by_name(const gchar *name, void *extra) { | |
| 1524 | GaimCipher *cipher; | |
| 1525 | ||
| 1526 | g_return_val_if_fail(name, NULL); | |
| 1527 | ||
| 1528 | cipher = gaim_ciphers_find_cipher(name); | |
| 1529 | ||
| 1530 | g_return_val_if_fail(cipher, NULL); | |
| 1531 | ||
| 1532 | return gaim_cipher_context_new(cipher, extra); | |
| 1533 | } | |
| 1534 | ||
| 1535 | void | |
| 1536 | gaim_cipher_context_reset(GaimCipherContext *context, void *extra) { | |
| 1537 | GaimCipher *cipher = NULL; | |
| 1538 | ||
| 1539 | g_return_if_fail(context); | |
| 1540 | ||
| 1541 | cipher = context->cipher; | |
| 1542 | g_return_if_fail(cipher); | |
| 1543 | ||
| 1544 | if(cipher->ops && cipher->ops->reset) | |
| 1545 | context->cipher->ops->reset(context, extra); | |
| 1546 | } | |
| 1547 | ||
| 1548 | void | |
| 1549 | gaim_cipher_context_destroy(GaimCipherContext *context) { | |
| 1550 | GaimCipher *cipher = NULL; | |
| 1551 | ||
| 1552 | g_return_if_fail(context); | |
| 1553 | ||
| 1554 | cipher = context->cipher; | |
| 1555 | g_return_if_fail(cipher); | |
| 1556 | ||
| 1557 | cipher->ref--; | |
| 1558 | ||
| 1559 | if(cipher->ops && cipher->ops->uninit) | |
| 1560 | cipher->ops->uninit(context); | |
| 1561 | ||
| 1562 | memset(context, 0, sizeof(context)); | |
| 1563 | g_free(context); | |
| 1564 | context = NULL; | |
| 1565 | } | |
| 1566 | ||
| 1567 | void | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1568 | gaim_cipher_context_set_iv(GaimCipherContext *context, guchar *iv, size_t len) |
| 10684 | 1569 | { |
| 1570 | GaimCipher *cipher = NULL; | |
| 1571 | ||
| 1572 | g_return_if_fail(context); | |
| 1573 | g_return_if_fail(iv); | |
| 1574 | ||
| 1575 | cipher = context->cipher; | |
| 1576 | g_return_if_fail(cipher); | |
| 1577 | ||
| 1578 | if(cipher->ops && cipher->ops->set_iv) | |
| 1579 | cipher->ops->set_iv(context, iv, len); | |
| 1580 | else | |
| 1581 | gaim_debug_info("cipher", "the %s cipher does not support the set" | |
| 1582 | "initialization vector operation\n", cipher->name); | |
| 1583 | } | |
| 1584 | ||
| 1585 | void | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1586 | gaim_cipher_context_append(GaimCipherContext *context, const guchar *data, |
| 10684 | 1587 | size_t len) |
| 1588 | { | |
| 1589 | GaimCipher *cipher = NULL; | |
| 1590 | ||
| 1591 | g_return_if_fail(context); | |
| 1592 | ||
| 1593 | cipher = context->cipher; | |
| 1594 | g_return_if_fail(cipher); | |
| 1595 | ||
| 1596 | if(cipher->ops && cipher->ops->append) | |
| 1597 | cipher->ops->append(context, data, len); | |
| 1598 | else | |
| 1599 | gaim_debug_info("cipher", "the %s cipher does not support the append " | |
| 1600 | "operation\n", cipher->name); | |
| 1601 | } | |
| 1602 | ||
| 1603 | gboolean | |
| 10687 | 1604 | gaim_cipher_context_digest(GaimCipherContext *context, size_t in_len, |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1605 | guchar digest[], size_t *out_len) |
| 10684 | 1606 | { |
| 1607 | GaimCipher *cipher = NULL; | |
| 1608 | ||
| 1609 | g_return_val_if_fail(context, FALSE); | |
| 1610 | ||
| 1611 | cipher = context->cipher; | |
| 1612 | g_return_val_if_fail(context, FALSE); | |
| 1613 | ||
| 1614 | if(cipher->ops && cipher->ops->digest) | |
| 10687 | 1615 | return cipher->ops->digest(context, in_len, digest, out_len); |
| 10684 | 1616 | else { |
| 1617 | gaim_debug_info("cipher", "the %s cipher does not support the digest " | |
| 1618 | "operation\n", cipher->name); | |
| 1619 | return FALSE; | |
| 1620 | } | |
| 1621 | } | |
| 1622 | ||
| 1623 | gboolean | |
| 10687 | 1624 | gaim_cipher_context_digest_to_str(GaimCipherContext *context, size_t in_len, |
| 1625 | gchar digest_s[], size_t *out_len) | |
| 10684 | 1626 | { |
| 10687 | 1627 | /* 8k is a bit excessive, will tweak later. */ |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1628 | guchar digest[BUF_LEN * 4]; |
| 10684 | 1629 | gint n = 0; |
| 1630 | size_t dlen = 0; | |
| 1631 | ||
| 1632 | g_return_val_if_fail(context, FALSE); | |
| 1633 | g_return_val_if_fail(digest_s, FALSE); | |
| 1634 | ||
| 10687 | 1635 | if(!gaim_cipher_context_digest(context, sizeof(digest), digest, &dlen)) |
| 10684 | 1636 | return FALSE; |
| 1637 | ||
| 10687 | 1638 | if(in_len < dlen * 2) |
| 1639 | return FALSE; | |
| 10684 | 1640 | |
| 1641 | for(n = 0; n < dlen; n++) | |
| 1642 | sprintf(digest_s + (n * 2), "%02x", digest[n]); | |
| 1643 | ||
| 1644 | digest_s[n * 2] = '\0'; | |
| 1645 | ||
| 10687 | 1646 | if(out_len) |
| 1647 | *out_len = dlen * 2; | |
| 1648 | ||
| 10684 | 1649 | return TRUE; |
| 1650 | } | |
| 1651 | ||
| 1652 | gint | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1653 | gaim_cipher_context_encrypt(GaimCipherContext *context, const guchar data[], |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1654 | size_t len, guchar output[], size_t *outlen) |
| 10684 | 1655 | { |
| 1656 | GaimCipher *cipher = NULL; | |
| 1657 | ||
| 1658 | g_return_val_if_fail(context, -1); | |
| 1659 | ||
| 1660 | cipher = context->cipher; | |
| 1661 | g_return_val_if_fail(cipher, -1); | |
| 1662 | ||
| 1663 | if(cipher->ops && cipher->ops->encrypt) | |
| 1664 | return cipher->ops->encrypt(context, data, len, output, outlen); | |
| 1665 | else { | |
| 1666 | gaim_debug_info("cipher", "the %s cipher does not support the encrypt" | |
| 1667 | "operation\n", cipher->name); | |
| 1668 | ||
| 1669 | if(outlen) | |
| 1670 | *outlen = -1; | |
| 1671 | ||
| 1672 | return -1; | |
| 1673 | } | |
| 1674 | } | |
| 1675 | ||
| 1676 | gint | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1677 | gaim_cipher_context_decrypt(GaimCipherContext *context, const guchar data[], |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1678 | size_t len, guchar output[], size_t *outlen) |
| 10684 | 1679 | { |
| 1680 | GaimCipher *cipher = NULL; | |
| 1681 | ||
| 1682 | g_return_val_if_fail(context, -1); | |
| 1683 | ||
| 1684 | cipher = context->cipher; | |
| 1685 | g_return_val_if_fail(cipher, -1); | |
| 1686 | ||
| 1687 | if(cipher->ops && cipher->ops->decrypt) | |
| 1688 | return cipher->ops->decrypt(context, data, len, output, outlen); | |
| 1689 | else { | |
| 1690 | gaim_debug_info("cipher", "the %s cipher does not support the decrypt" | |
| 1691 | "operation\n", cipher->name); | |
| 1692 | ||
| 1693 | if(outlen) | |
| 1694 | *outlen = -1; | |
| 1695 | ||
| 1696 | return -1; | |
| 1697 | } | |
| 1698 | } | |
| 1699 | ||
| 1700 | void | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1701 | gaim_cipher_context_set_salt(GaimCipherContext *context, guchar *salt) { |
| 10684 | 1702 | GaimCipher *cipher = NULL; |
| 1703 | ||
| 1704 | g_return_if_fail(context); | |
| 1705 | ||
| 1706 | cipher = context->cipher; | |
| 1707 | g_return_if_fail(cipher); | |
| 1708 | ||
| 1709 | if(cipher->ops && cipher->ops->set_salt) | |
| 1710 | cipher->ops->set_salt(context, salt); | |
| 1711 | else | |
| 1712 | gaim_debug_info("cipher", "the %s cipher does not support the " | |
| 1713 | "set_salt operation\n", cipher->name); | |
| 1714 | } | |
| 1715 | ||
| 1716 | size_t | |
| 1717 | gaim_cipher_context_get_salt_size(GaimCipherContext *context) { | |
| 1718 | GaimCipher *cipher = NULL; | |
| 1719 | ||
| 1720 | g_return_val_if_fail(context, -1); | |
| 1721 | ||
| 1722 | cipher = context->cipher; | |
| 1723 | g_return_val_if_fail(cipher, -1); | |
| 1724 | ||
| 1725 | if(cipher->ops && cipher->ops->get_salt_size) | |
| 1726 | return cipher->ops->get_salt_size(context); | |
| 1727 | else { | |
| 1728 | gaim_debug_info("cipher", "the %s cipher does not support the " | |
| 1729 | "get_salt_size operation\n", cipher->name); | |
| 1730 | ||
| 1731 | return -1; | |
| 1732 | } | |
| 1733 | } | |
| 1734 | ||
| 1735 | void | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1736 | gaim_cipher_context_set_key(GaimCipherContext *context, guchar *key) { |
| 10684 | 1737 | GaimCipher *cipher = NULL; |
| 1738 | ||
| 1739 | g_return_if_fail(context); | |
| 1740 | ||
| 1741 | cipher = context->cipher; | |
| 1742 | g_return_if_fail(cipher); | |
| 1743 | ||
| 1744 | if(cipher->ops && cipher->ops->set_key) | |
| 1745 | cipher->ops->set_key(context, key); | |
| 1746 | else | |
| 1747 | gaim_debug_info("cipher", "the %s cipher does not support the " | |
| 1748 | "set_key operation\n", cipher->name); | |
| 1749 | } | |
| 1750 | ||
| 1751 | size_t | |
| 1752 | gaim_cipher_context_get_key_size(GaimCipherContext *context) { | |
| 1753 | GaimCipher *cipher = NULL; | |
| 1754 | ||
| 1755 | g_return_val_if_fail(context, -1); | |
| 1756 | ||
| 1757 | cipher = context->cipher; | |
| 1758 | g_return_val_if_fail(cipher, -1); | |
| 1759 | ||
| 1760 | if(cipher->ops && cipher->ops->get_key_size) | |
| 1761 | return cipher->ops->get_key_size(context); | |
| 1762 | else { | |
| 1763 | gaim_debug_info("cipher", "the %s cipher does not support the " | |
| 1764 | "get_key_size operation\n", cipher->name); | |
| 1765 | ||
| 1766 | return -1; | |
| 1767 | } | |
| 1768 | } | |
| 1769 | ||
| 1770 | void | |
| 1771 | gaim_cipher_context_set_data(GaimCipherContext *context, gpointer data) { | |
| 1772 | g_return_if_fail(context); | |
| 1773 | ||
| 1774 | context->data = data; | |
| 1775 | } | |
| 1776 | ||
| 1777 | gpointer | |
| 1778 | gaim_cipher_context_get_data(GaimCipherContext *context) { | |
| 1779 | g_return_val_if_fail(context, NULL); | |
| 1780 | ||
| 1781 | return context->data; | |
| 1782 | } |