libpurple/cipher.c

Tue, 16 Mar 2010 23:14:54 +0000

author
Marcus Lundblad <malu@pidgin.im>
date
Tue, 16 Mar 2010 23:14:54 +0000
branch
cpw.malu.ft_thumbnails
changeset 30114
8472e53fbbfc
parent 28762
e009359b6390
child 31407
8c850977cb42
permissions
-rw-r--r--

Set desired image formats for thumbnails as a parameter to
purple_xfer_prepare_thumbnail instead of putting it in PrplInfo

10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1 /*
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2 * purple
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3 *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
4 * Purple is the legal property of its developers, whose names are too numerous
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
6 * source distribution.
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
7 *
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
8 * Original md5
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
9 * Copyright (C) 2001-2003 Christophe Devine <c.devine@cr0.net>
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
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).
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13760
diff changeset
13 *
11329
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.
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13760
diff changeset
29 *
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
30 * Please see below for more legal information!
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13760
diff changeset
31 *
11335
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.
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13760
diff changeset
36 *
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
37 * This file is part of GnuPG.
14097
0c340861ab79 [gaim-migrate @ 16638]
Mark Doliner <markdoliner@pidgin.im>
parents: 13760
diff changeset
38 *
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
39 * This program is free software; you can redistribute it and/or modify
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
40 * it under the terms of the GNU General Public License as published by
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
41 * the Free Software Foundation; either version 2 of the License, or
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
42 * (at your option) any later version.
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
43 *
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
44 * This program is distributed in the hope that it will be useful,
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
45 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
46 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
47 * GNU General Public License for more details.
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
48 *
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
49 * You should have received a copy of the GNU General Public License
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
50 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 19832
diff changeset
51 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
52 */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
53 #include "internal.h"
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
54 #include "cipher.h"
13760
09669e542e2f [gaim-migrate @ 16169]
Mark Doliner <markdoliner@pidgin.im>
parents: 13699
diff changeset
55 #include "dbus-maybe.h"
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
56 #include "debug.h"
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
57 #include "signals.h"
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
58 #include "value.h"
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
59
27539
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
60 #if GLIB_CHECK_VERSION(2,16,0)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
61 static void
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
62 purple_g_checksum_init(PurpleCipherContext *context, GChecksumType type)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
63 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
64 GChecksum *checksum;
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
65
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
66 checksum = g_checksum_new(type);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
67 purple_cipher_context_set_data(context, checksum);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
68 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
69
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
70 static void
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
71 purple_g_checksum_reset(PurpleCipherContext *context, GChecksumType type)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
72 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
73 GChecksum *checksum;
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
74
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
75 checksum = purple_cipher_context_get_data(context);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
76 g_return_if_fail(checksum != NULL);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
77
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
78 #if GLIB_CHECK_VERSION(2,18,0)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
79 g_checksum_reset(checksum);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
80 #else
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
81 g_checksum_free(checksum);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
82 checksum = g_checksum_new(type);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
83 purple_cipher_context_set_data(context, checksum);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
84 #endif
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
85 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
86
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
87 static void
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
88 purple_g_checksum_uninit(PurpleCipherContext *context)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
89 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
90 GChecksum *checksum;
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
91
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
92 checksum = purple_cipher_context_get_data(context);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
93 g_return_if_fail(checksum != NULL);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
94
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
95 g_checksum_free(checksum);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
96 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
97
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
98 static void
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
99 purple_g_checksum_append(PurpleCipherContext *context, const guchar *data,
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
100 gsize len)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
101 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
102 GChecksum *checksum;
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
103
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
104 checksum = purple_cipher_context_get_data(context);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
105 g_return_if_fail(checksum != NULL);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
106
27541
98dad20a0da7 Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents: 27539
diff changeset
107 while (len >= G_MAXSSIZE) {
98dad20a0da7 Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents: 27539
diff changeset
108 g_checksum_update(checksum, data, G_MAXSSIZE);
98dad20a0da7 Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents: 27539
diff changeset
109 len -= G_MAXSSIZE;
98dad20a0da7 Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents: 27539
diff changeset
110 data += G_MAXSSIZE;
98dad20a0da7 Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents: 27539
diff changeset
111 }
98dad20a0da7 Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents: 27539
diff changeset
112
98dad20a0da7 Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents: 27539
diff changeset
113 if (len)
27539
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
114 g_checksum_update(checksum, data, len);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
115 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
116
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
117 static gboolean
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
118 purple_g_checksum_digest(PurpleCipherContext *context, GChecksumType type,
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
119 gsize len, guchar *digest, gsize *out_len)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
120 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
121 GChecksum *checksum;
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
122 const gssize required_length = g_checksum_type_get_length(type);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
123
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
124 checksum = purple_cipher_context_get_data(context);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
125
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
126 g_return_val_if_fail(len >= required_length, FALSE);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
127 g_return_val_if_fail(checksum != NULL, FALSE);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
128
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
129 g_checksum_get_digest(checksum, digest, &len);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
130
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
131 purple_cipher_context_reset(context, NULL);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
132
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
133 if (out_len)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
134 *out_len = len;
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
135
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
136 return TRUE;
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
137 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
138 #endif
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
139
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
140
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
141 /*******************************************************************************
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
142 * MD5
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
143 ******************************************************************************/
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
144 #define MD5_HMAC_BLOCK_SIZE 64
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
145
27539
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
146 static size_t
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
147 md5_get_block_size(PurpleCipherContext *context)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
148 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
149 /* This does not change (in this case) */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
150 return MD5_HMAC_BLOCK_SIZE;
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
151 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
152
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
153 #if GLIB_CHECK_VERSION(2,16,0)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
154
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
155 static void
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
156 md5_init(PurpleCipherContext *context, void *extra)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
157 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
158 purple_g_checksum_init(context, G_CHECKSUM_MD5);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
159 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
160
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
161 static void
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
162 md5_reset(PurpleCipherContext *context, void *extra)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
163 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
164 purple_g_checksum_reset(context, G_CHECKSUM_MD5);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
165 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
166
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
167 static gboolean
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
168 md5_digest(PurpleCipherContext *context, gsize in_len, guchar digest[16],
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
169 size_t *out_len)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
170 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
171 return purple_g_checksum_digest(context, G_CHECKSUM_MD5, in_len,
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
172 digest, out_len);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
173 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
174
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
175 static PurpleCipherOps MD5Ops = {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
176 NULL, /* Set Option */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
177 NULL, /* Get Option */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
178 md5_init, /* init */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
179 md5_reset, /* reset */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
180 purple_g_checksum_uninit, /* uninit */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
181 NULL, /* set iv */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
182 purple_g_checksum_append, /* append */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
183 md5_digest, /* digest */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
184 NULL, /* encrypt */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
185 NULL, /* decrypt */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
186 NULL, /* set salt */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
187 NULL, /* get salt size */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
188 NULL, /* set key */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
189 NULL, /* get key size */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
190 NULL, /* set batch mode */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
191 NULL, /* get batch mode */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
192 md5_get_block_size, /* get block size */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
193 NULL /* set key with len */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
194 };
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
195
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
196 #else /* GLIB_CHECK_VERSION(2,16,0) */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
197
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
198 struct MD5Context {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
199 guint32 total[2];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
200 guint32 state[4];
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
201 guchar buffer[64];
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
202 };
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
203
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
204 #define MD5_GET_GUINT32(n,b,i) { \
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
205 (n) = ((guint32)(b) [(i) ] ) \
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
206 | ((guint32)(b) [(i) + 1] << 8) \
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
207 | ((guint32)(b) [(i) + 2] << 16) \
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
208 | ((guint32)(b) [(i) + 3] << 24); \
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
209 }
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
210 #define MD5_PUT_GUINT32(n,b,i) { \
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
211 (b)[(i) ] = (guchar)((n) ); \
13219
5b0a1fd8bc84 [gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents: 12389
diff changeset
212 (b)[(i) + 1] = (guchar)((n) >> 8); \
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
213 (b)[(i) + 2] = (guchar)((n) >> 16); \
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
214 (b)[(i) + 3] = (guchar)((n) >> 24); \
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
215 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
216
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
217 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
218 md5_init(PurpleCipherContext *context, gpointer extra) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
219 struct MD5Context *md5_context;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
220
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
221 md5_context = g_new0(struct MD5Context, 1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
222
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
223 purple_cipher_context_set_data(context, md5_context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
224
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
225 purple_cipher_context_reset(context, extra);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
226 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
227
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
228 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
229 md5_reset(PurpleCipherContext *context, gpointer extra) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
230 struct MD5Context *md5_context;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
231
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
232 md5_context = purple_cipher_context_get_data(context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
233
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
234 md5_context->total[0] = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
235 md5_context->total[1] = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
236
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
237 md5_context->state[0] = 0x67452301;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
238 md5_context->state[1] = 0xEFCDAB89;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
239 md5_context->state[2] = 0x98BADCFE;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
240 md5_context->state[3] = 0x10325476;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
241
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
242 memset(md5_context->buffer, 0, sizeof(md5_context->buffer));
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
243 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
244
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
245 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
246 md5_uninit(PurpleCipherContext *context) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
247 struct MD5Context *md5_context;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
248
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
249 purple_cipher_context_reset(context, NULL);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
250
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
251 md5_context = purple_cipher_context_get_data(context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
252 memset(md5_context, 0, sizeof(md5_context));
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
253
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
254 g_free(md5_context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
255 md5_context = NULL;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
256 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
257
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
258 static void
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
259 md5_process(struct MD5Context *md5_context, const guchar data[64]) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
260 guint32 X[16], A, B, C, D;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
261
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
262 A = md5_context->state[0];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
263 B = md5_context->state[1];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
264 C = md5_context->state[2];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
265 D = md5_context->state[3];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
266
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
267 MD5_GET_GUINT32(X[ 0], data, 0);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
268 MD5_GET_GUINT32(X[ 1], data, 4);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
269 MD5_GET_GUINT32(X[ 2], data, 8);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
270 MD5_GET_GUINT32(X[ 3], data, 12);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
271 MD5_GET_GUINT32(X[ 4], data, 16);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
272 MD5_GET_GUINT32(X[ 5], data, 20);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
273 MD5_GET_GUINT32(X[ 6], data, 24);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
274 MD5_GET_GUINT32(X[ 7], data, 28);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
275 MD5_GET_GUINT32(X[ 8], data, 32);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
276 MD5_GET_GUINT32(X[ 9], data, 36);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
277 MD5_GET_GUINT32(X[10], data, 40);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
278 MD5_GET_GUINT32(X[11], data, 44);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
279 MD5_GET_GUINT32(X[12], data, 48);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
280 MD5_GET_GUINT32(X[13], data, 52);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
281 MD5_GET_GUINT32(X[14], data, 56);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
282 MD5_GET_GUINT32(X[15], data, 60);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
283
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
284 #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
285 #define P(a,b,c,d,k,s,t) { \
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
286 a += F(b,c,d) + X[k] + t; \
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
287 a = S(a,s) + b; \
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
288 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
289
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
290 /* first pass */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
291 #define F(x,y,z) (z ^ (x & (y ^ z)))
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
292 P(A, B, C, D, 0, 7, 0xD76AA478);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
293 P(D, A, B, C, 1, 12, 0xE8C7B756);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
294 P(C, D, A, B, 2, 17, 0x242070DB);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
295 P(B, C, D, A, 3, 22, 0xC1BDCEEE);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
296 P(A, B, C, D, 4, 7, 0xF57C0FAF);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
297 P(D, A, B, C, 5, 12, 0x4787C62A);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
298 P(C, D, A, B, 6, 17, 0xA8304613);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
299 P(B, C, D, A, 7, 22, 0xFD469501);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
300 P(A, B, C, D, 8, 7, 0x698098D8);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
301 P(D, A, B, C, 9, 12, 0x8B44F7AF);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
302 P(C, D, A, B, 10, 17, 0xFFFF5BB1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
303 P(B, C, D, A, 11, 22, 0x895CD7BE);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
304 P(A, B, C, D, 12, 7, 0x6B901122);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
305 P(D, A, B, C, 13, 12, 0xFD987193);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
306 P(C, D, A, B, 14, 17, 0xA679438E);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
307 P(B, C, D, A, 15, 22, 0x49B40821);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
308 #undef F
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
309
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
310 /* second pass */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
311 #define F(x,y,z) (y ^ (z & (x ^ y)))
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
312 P(A, B, C, D, 1, 5, 0xF61E2562);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
313 P(D, A, B, C, 6, 9, 0xC040B340);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
314 P(C, D, A, B, 11, 14, 0x265E5A51);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
315 P(B, C, D, A, 0, 20, 0xE9B6C7AA);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
316 P(A, B, C, D, 5, 5, 0xD62F105D);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
317 P(D, A, B, C, 10, 9, 0x02441453);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
318 P(C, D, A, B, 15, 14, 0xD8A1E681);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
319 P(B, C, D, A, 4, 20, 0xE7D3FBC8);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
320 P(A, B, C, D, 9, 5, 0x21E1CDE6);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
321 P(D, A, B, C, 14, 9, 0xC33707D6);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
322 P(C, D, A, B, 3, 14, 0xF4D50D87);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
323 P(B, C, D, A, 8, 20, 0x455A14ED);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
324 P(A, B, C, D, 13, 5, 0xA9E3E905);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
325 P(D, A, B, C, 2, 9, 0xFCEFA3F8);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
326 P(C, D, A, B, 7, 14, 0x676F02D9);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
327 P(B, C, D, A, 12, 20, 0x8D2A4C8A);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
328 #undef F
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
329
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
330 /* third pass */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
331 #define F(x,y,z) (x ^ y ^ z)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
332 P(A, B, C, D, 5, 4, 0xFFFA3942);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
333 P(D, A, B, C, 8, 11, 0x8771F681);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
334 P(C, D, A, B, 11, 16, 0x6D9D6122);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
335 P(B, C, D, A, 14, 23, 0xFDE5380C);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
336 P(A, B, C, D, 1, 4, 0xA4BEEA44);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
337 P(D, A, B, C, 4, 11, 0x4BDECFA9);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
338 P(C, D, A, B, 7, 16, 0xF6BB4B60);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
339 P(B, C, D, A, 10, 23, 0xBEBFBC70);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
340 P(A, B, C, D, 13, 4, 0x289B7EC6);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
341 P(D, A, B, C, 0, 11, 0xEAA127FA);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
342 P(C, D, A, B, 3, 16, 0xD4EF3085);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
343 P(B, C, D, A, 6, 23, 0x04881D05);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
344 P(A, B, C, D, 9, 4, 0xD9D4D039);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
345 P(D, A, B, C, 12, 11, 0xE6DB99E5);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
346 P(C, D, A, B, 15, 16, 0x1FA27CF8);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
347 P(B, C, D, A, 2, 23, 0xC4AC5665);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
348 #undef F
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
349
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
350 /* forth pass */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
351 #define F(x,y,z) (y ^ (x | ~z))
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
352 P(A, B, C, D, 0, 6, 0xF4292244);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
353 P(D, A, B, C, 7, 10, 0x432AFF97);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
354 P(C, D, A, B, 14, 15, 0xAB9423A7);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
355 P(B, C, D, A, 5, 21, 0xFC93A039);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
356 P(A, B, C, D, 12, 6, 0x655B59C3);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
357 P(D, A, B, C, 3, 10, 0x8F0CCC92);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
358 P(C, D, A, B, 10, 15, 0xFFEFF47D);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
359 P(B, C, D, A, 1, 21, 0x85845DD1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
360 P(A, B, C, D, 8, 6, 0x6FA87E4F);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
361 P(D, A, B, C, 15, 10, 0xFE2CE6E0);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
362 P(C, D, A, B, 6, 15, 0xA3014314);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
363 P(B, C, D, A, 13, 21, 0x4E0811A1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
364 P(A, B, C, D, 4, 6, 0xF7537E82);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
365 P(D, A, B, C, 11, 10, 0xBD3AF235);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
366 P(C, D, A, B, 2, 15, 0x2AD7D2BB);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
367 P(B, C, D, A, 9, 21, 0xEB86D391);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
368 #undef F
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
369 #undef P
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
370 #undef S
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
371
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
372 md5_context->state[0] += A;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
373 md5_context->state[1] += B;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
374 md5_context->state[2] += C;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
375 md5_context->state[3] += D;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
376 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
377
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
378 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
379 md5_append(PurpleCipherContext *context, const guchar *data, size_t len) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
380 struct MD5Context *md5_context = NULL;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
381 guint32 left = 0, fill = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
382
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
383 g_return_if_fail(context != NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
384
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
385 md5_context = purple_cipher_context_get_data(context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
386 g_return_if_fail(md5_context != NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
387
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
388 left = md5_context->total[0] & 0x3F;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
389 fill = 64 - left;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
390
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
391 md5_context->total[0] += len;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
392 md5_context->total[0] &= 0xFFFFFFFF;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
393
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
394 if(md5_context->total[0] < len)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
395 md5_context->total[1]++;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
396
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
397 if(left && len >= fill) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
398 memcpy((md5_context->buffer + left), data, fill);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
399 md5_process(md5_context, md5_context->buffer);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
400 len -= fill;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
401 data += fill;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
402 left = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
403 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
404
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
405 while(len >= 64) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
406 md5_process(md5_context, data);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
407 len -= 64;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
408 data += 64;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
409 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
410
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
411 if(len) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
412 memcpy((md5_context->buffer + left), data, len);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
413 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
414 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
415
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
416 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
417 md5_digest(PurpleCipherContext *context, size_t in_len, guchar digest[16],
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
418 size_t *out_len)
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
419 {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
420 struct MD5Context *md5_context = NULL;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
421 guint32 last, pad;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
422 guint32 high, low;
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
423 guchar message[8];
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
424 guchar padding[64] = {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
425 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
426 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
427 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
428 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
429 };
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
430
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
431 g_return_val_if_fail(in_len >= 16, FALSE);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
432
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
433 md5_context = purple_cipher_context_get_data(context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
434
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
435 high = (md5_context->total[0] >> 29)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
436 | (md5_context->total[1] << 3);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
437 low = (md5_context->total[0] << 3);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
438
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
439 MD5_PUT_GUINT32(low, message, 0);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
440 MD5_PUT_GUINT32(high, message, 4);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
441
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
442 last = md5_context->total[0] & 0x3F;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
443 pad = (last < 56) ? (56 - last) : (120 - last);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
444
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
445 md5_append(context, padding, pad);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
446 md5_append(context, message, 8);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
447
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
448 MD5_PUT_GUINT32(md5_context->state[0], digest, 0);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
449 MD5_PUT_GUINT32(md5_context->state[1], digest, 4);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
450 MD5_PUT_GUINT32(md5_context->state[2], digest, 8);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
451 MD5_PUT_GUINT32(md5_context->state[3], digest, 12);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
452
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
453 if(out_len)
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
454 *out_len = 16;
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
455
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
456 return TRUE;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
457 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
458
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
459 static PurpleCipherOps MD5Ops = {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
460 NULL, /* Set option */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
461 NULL, /* Get option */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
462 md5_init, /* init */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
463 md5_reset, /* reset */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
464 md5_uninit, /* uninit */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
465 NULL, /* set iv */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
466 md5_append, /* append */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
467 md5_digest, /* digest */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
468 NULL, /* encrypt */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
469 NULL, /* decrypt */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
470 NULL, /* set salt */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
471 NULL, /* get salt size */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
472 NULL, /* set key */
16747
fc3608e1e661 I _think_ this is it for libpurple's padding...
Gary Kramlich <grim@reaperworld.com>
parents: 15884
diff changeset
473 NULL, /* get key size */
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
474 NULL, /* set batch mode */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
475 NULL, /* get batch mode */
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
476 md5_get_block_size, /* get block size */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
477 NULL /* set key with len */
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
478 };
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
479
27539
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
480 #endif /* GLIB_CHECK_VERSION(2,16,0) */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
481
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
482 /*******************************************************************************
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
483 * MD4
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
484 ******************************************************************************/
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
485 #define MD4_DIGEST_SIZE 16
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
486 #define MD4_HMAC_BLOCK_SIZE 64
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
487 #define MD4_BLOCK_WORDS 16
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
488 #define MD4_HASH_WORDS 4
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
489
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
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
492 struct MD4_Context {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
493 guint32 hash[MD4_HASH_WORDS];
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
494 guint32 block[MD4_BLOCK_WORDS];
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
495 guint64 byte_count;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
496 };
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
497
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
498 static inline guint32 lshift(guint32 x, unsigned int s)
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 x &= 0xFFFFFFFF;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
501 return ((x << s) & 0xFFFFFFFF) | (x >> (32 - s));
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
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
504 static inline guint32 F(guint32 x, guint32 y, guint32 z)
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 return (x & y) | ((~x) & z);
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
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
509 static inline guint32 G(guint32 x, guint32 y, guint32 z)
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
510 {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
511 return (x & y) | (x & z) | (y & z);
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 static inline guint32 H(guint32 x, guint32 y, guint32 z)
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
515 {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
516 return x ^ y ^ z;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
517 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
518
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
519 #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
520 #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
521 #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
522
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
523 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
524 {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
525 while (words--) {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
526 *buf=GUINT_FROM_LE(*buf);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
527 buf++;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
528 }
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 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
532 {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
533 while (words--) {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
534 *buf=GUINT_TO_LE(*buf);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
535 buf++;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
536 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
537 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
538
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
539 static void md4_transform(guint32 *hash, guint32 const *in)
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 guint32 a, b, c, d;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
542
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
543 a = hash[0];
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
544 b = hash[1];
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
545 c = hash[2];
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
546 d = hash[3];
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
547
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
548 ROUND1(a, b, c, d, in[0], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
549 ROUND1(d, a, b, c, in[1], 7);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
550 ROUND1(c, d, a, b, in[2], 11);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
551 ROUND1(b, c, d, a, in[3], 19);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
552 ROUND1(a, b, c, d, in[4], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
553 ROUND1(d, a, b, c, in[5], 7);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
554 ROUND1(c, d, a, b, in[6], 11);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
555 ROUND1(b, c, d, a, in[7], 19);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
556 ROUND1(a, b, c, d, in[8], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
557 ROUND1(d, a, b, c, in[9], 7);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
558 ROUND1(c, d, a, b, in[10], 11);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
559 ROUND1(b, c, d, a, in[11], 19);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
560 ROUND1(a, b, c, d, in[12], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
561 ROUND1(d, a, b, c, in[13], 7);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
562 ROUND1(c, d, a, b, in[14], 11);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
563 ROUND1(b, c, d, a, in[15], 19);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
564
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
565 ROUND2(a, b, c, d,in[ 0], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
566 ROUND2(d, a, b, c, in[4], 5);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
567 ROUND2(c, d, a, b, in[8], 9);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
568 ROUND2(b, c, d, a, in[12], 13);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
569 ROUND2(a, b, c, d, in[1], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
570 ROUND2(d, a, b, c, in[5], 5);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
571 ROUND2(c, d, a, b, in[9], 9);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
572 ROUND2(b, c, d, a, in[13], 13);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
573 ROUND2(a, b, c, d, in[2], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
574 ROUND2(d, a, b, c, in[6], 5);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
575 ROUND2(c, d, a, b, in[10], 9);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
576 ROUND2(b, c, d, a, in[14], 13);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
577 ROUND2(a, b, c, d, in[3], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
578 ROUND2(d, a, b, c, in[7], 5);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
579 ROUND2(c, d, a, b, in[11], 9);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
580 ROUND2(b, c, d, a, in[15], 13);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
581
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
582 ROUND3(a, b, c, d,in[ 0], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
583 ROUND3(d, a, b, c, in[8], 9);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
584 ROUND3(c, d, a, b, in[4], 11);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
585 ROUND3(b, c, d, a, in[12], 15);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
586 ROUND3(a, b, c, d, in[2], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
587 ROUND3(d, a, b, c, in[10], 9);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
588 ROUND3(c, d, a, b, in[6], 11);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
589 ROUND3(b, c, d, a, in[14], 15);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
590 ROUND3(a, b, c, d, in[1], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
591 ROUND3(d, a, b, c, in[9], 9);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
592 ROUND3(c, d, a, b, in[5], 11);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
593 ROUND3(b, c, d, a, in[13], 15);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
594 ROUND3(a, b, c, d, in[3], 3);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
595 ROUND3(d, a, b, c, in[11], 9);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
596 ROUND3(c, d, a, b, in[7], 11);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
597 ROUND3(b, c, d, a, in[15], 15);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
598
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
599 hash[0] += a;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
600 hash[1] += b;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
601 hash[2] += c;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
602 hash[3] += d;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
603 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
604
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
605 static inline void md4_transform_helper(struct MD4_Context *ctx)
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
606 {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
607 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
608 md4_transform(ctx->hash, ctx->block);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
609 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
610
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
611 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
612 md4_init(PurpleCipherContext *context, gpointer extra) {
13219
5b0a1fd8bc84 [gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents: 12389
diff changeset
613 struct MD4_Context *mctx;
5b0a1fd8bc84 [gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents: 12389
diff changeset
614 mctx = g_new0(struct MD4_Context, 1);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
615 purple_cipher_context_set_data(context, mctx);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
616 purple_cipher_context_reset(context, extra);
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
617
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
618 mctx->hash[0] = 0x67452301;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
619 mctx->hash[1] = 0xefcdab89;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
620 mctx->hash[2] = 0x98badcfe;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
621 mctx->hash[3] = 0x10325476;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
622 mctx->byte_count = 0;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
623 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
624
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
625 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
626 md4_reset(PurpleCipherContext *context, gpointer extra) {
13219
5b0a1fd8bc84 [gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents: 12389
diff changeset
627 struct MD4_Context *mctx;
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
628
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
629 mctx = purple_cipher_context_get_data(context);
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
630
13219
5b0a1fd8bc84 [gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents: 12389
diff changeset
631 mctx->hash[0] = 0x67452301;
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
632 mctx->hash[1] = 0xefcdab89;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
633 mctx->hash[2] = 0x98badcfe;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
634 mctx->hash[3] = 0x10325476;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
635 mctx->byte_count = 0;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
636 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
637
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
638 static void
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 25859
diff changeset
639 md4_append(PurpleCipherContext *context, const guchar *data, size_t len)
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
640 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
641 struct MD4_Context *mctx = purple_cipher_context_get_data(context);
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
642 const guint32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
643
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
644 mctx->byte_count += len;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
645
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
646 if (avail > len) {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
647 memcpy((char *)mctx->block + (sizeof(mctx->block) - avail),
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
648 data, len);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
649 return;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
650 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
651
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
652 memcpy((char *)mctx->block + (sizeof(mctx->block) - avail),
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
653 data, avail);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
654
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
655 md4_transform_helper(mctx);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
656 data += avail;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
657 len -= avail;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
658
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
659 while (len >= sizeof(mctx->block)) {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
660 memcpy(mctx->block, data, sizeof(mctx->block));
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
661 md4_transform_helper(mctx);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
662 data += sizeof(mctx->block);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
663 len -= sizeof(mctx->block);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
664 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
665
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
666 memcpy(mctx->block, data, len);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
667 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
668
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
669 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
670 md4_digest(PurpleCipherContext *context, size_t in_len, guchar *out,
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
671 size_t *out_len)
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
672 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
673 struct MD4_Context *mctx = purple_cipher_context_get_data(context);
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
674 const unsigned int offset = mctx->byte_count & 0x3f;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
675 char *p = (char *)mctx->block + offset;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
676 int padding = 56 - (offset + 1);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
677
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 25859
diff changeset
678
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
679 if(in_len<16) return FALSE;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
680 if(out_len) *out_len = 16;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
681 *p++ = 0x80;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
682 if (padding < 0) {
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
683 memset(p, 0x00, padding + sizeof (guint64));
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
684 md4_transform_helper(mctx);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
685 p = (char *)mctx->block;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
686 padding = 56;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
687 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
688
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
689 memset(p, 0, padding);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
690 mctx->block[14] = mctx->byte_count << 3;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
691 mctx->block[15] = mctx->byte_count >> 29;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
692 le32_to_cpu_array(mctx->block, (sizeof(mctx->block) -
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
693 sizeof(guint64)) / sizeof(guint32));
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
694 md4_transform(mctx->hash, mctx->block);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
695 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
696 memcpy(out, mctx->hash, sizeof(mctx->hash));
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
697 memset(mctx, 0, sizeof(*mctx));
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
698 return TRUE;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
699 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
700
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
701 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
702 md4_uninit(PurpleCipherContext *context) {
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
703 struct MD4_Context *md4_context;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
704
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
705 purple_cipher_context_reset(context, NULL);
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
706
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
707 md4_context = purple_cipher_context_get_data(context);
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
708 memset(md4_context, 0, sizeof(md4_context));
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
709
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
710 g_free(md4_context);
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
711 md4_context = NULL;
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
712 }
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
713
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
714 static size_t
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
715 md4_get_block_size(PurpleCipherContext *context)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
716 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
717 /* This does not change (in this case) */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
718 return MD4_HMAC_BLOCK_SIZE;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
719 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
720
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
721 static PurpleCipherOps MD4Ops = {
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
722 NULL, /* Set option */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
723 NULL, /* Get option */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
724 md4_init, /* init */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
725 md4_reset, /* reset */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
726 md4_uninit, /* uninit */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
727 NULL, /* set iv */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
728 md4_append, /* append */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
729 md4_digest, /* digest */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
730 NULL, /* encrypt */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
731 NULL, /* decrypt */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
732 NULL, /* set salt */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
733 NULL, /* get salt size */
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
734 NULL, /* set key */
16747
fc3608e1e661 I _think_ this is it for libpurple's padding...
Gary Kramlich <grim@reaperworld.com>
parents: 15884
diff changeset
735 NULL, /* get key size */
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
736 NULL, /* set batch mode */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
737 NULL, /* get batch mode */
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
738 md4_get_block_size, /* get block size */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
739 NULL /* set key with len */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
740 };
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
741
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
742 /*******************************************************************************
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
743 * HMAC
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
744 ******************************************************************************/
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
745
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
746 struct HMAC_Context {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
747 PurpleCipherContext *hash;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
748 char *name;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
749 int blocksize;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
750 guchar *opad;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
751 };
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
752
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
753 static void
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
754 hmac_init(PurpleCipherContext *context, gpointer extra)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
755 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
756 struct HMAC_Context *hctx;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
757 hctx = g_new0(struct HMAC_Context, 1);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
758 purple_cipher_context_set_data(context, hctx);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
759 purple_cipher_context_reset(context, extra);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
760 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
761
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
762 static void
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
763 hmac_reset(PurpleCipherContext *context, gpointer extra)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
764 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
765 struct HMAC_Context *hctx;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
766
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
767 hctx = purple_cipher_context_get_data(context);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
768
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
769 g_free(hctx->name);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
770 hctx->name = NULL;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
771 if (hctx->hash)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
772 purple_cipher_context_destroy(hctx->hash);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
773 hctx->hash = NULL;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
774 hctx->blocksize = 0;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
775 g_free(hctx->opad);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
776 hctx->opad = NULL;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
777 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
778
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
779 static void
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
780 hmac_set_opt(PurpleCipherContext *context, const gchar *name, void *value)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
781 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
782 struct HMAC_Context *hctx;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
783
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
784 hctx = purple_cipher_context_get_data(context);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
785
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 23867
diff changeset
786 if (purple_strequal(name, "hash")) {
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
787 g_free(hctx->name);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
788 if (hctx->hash)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
789 purple_cipher_context_destroy(hctx->hash);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
790 hctx->name = g_strdup((char*)value);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
791 hctx->hash = purple_cipher_context_new_by_name((char *)value, NULL);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
792 hctx->blocksize = purple_cipher_context_get_block_size(hctx->hash);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
793 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
794 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
795
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
796 static void *
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
797 hmac_get_opt(PurpleCipherContext *context, const gchar *name)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
798 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
799 struct HMAC_Context *hctx;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
800
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
801 hctx = purple_cipher_context_get_data(context);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
802
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 23867
diff changeset
803 if (purple_strequal(name, "hash")) {
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
804 return hctx->name;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
805 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
806
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
807 return NULL;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
808 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
809
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
810 static void
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 25859
diff changeset
811 hmac_append(PurpleCipherContext *context, const guchar *data, size_t len)
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
812 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
813 struct HMAC_Context *hctx = purple_cipher_context_get_data(context);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
814
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
815 g_return_if_fail(hctx->hash != NULL);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
816
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
817 purple_cipher_context_append(hctx->hash, data, len);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
818 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
819
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
820 static gboolean
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
821 hmac_digest(PurpleCipherContext *context, size_t in_len, guchar *out, size_t *out_len)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
822 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
823 struct HMAC_Context *hctx = purple_cipher_context_get_data(context);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
824 PurpleCipherContext *hash = hctx->hash;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
825 guchar *inner_hash;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
826 size_t hash_len;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
827 gboolean result;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
828
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
829 g_return_val_if_fail(hash != NULL, FALSE);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
830
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
831 inner_hash = g_malloc(100); /* TODO: Should be enough for now... */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
832 result = purple_cipher_context_digest(hash, 100, inner_hash, &hash_len);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
833
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
834 purple_cipher_context_reset(hash, NULL);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
835
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
836 purple_cipher_context_append(hash, hctx->opad, hctx->blocksize);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
837 purple_cipher_context_append(hash, inner_hash, hash_len);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
838
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
839 g_free(inner_hash);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
840
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
841 result = result && purple_cipher_context_digest(hash, in_len, out, out_len);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
842
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
843 return result;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
844 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
845
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
846 static void
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
847 hmac_uninit(PurpleCipherContext *context)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
848 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
849 struct HMAC_Context *hctx;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
850
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
851 purple_cipher_context_reset(context, NULL);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
852
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
853 hctx = purple_cipher_context_get_data(context);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
854
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
855 g_free(hctx);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
856 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
857
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
858 static void
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
859 hmac_set_key_with_len(PurpleCipherContext *context, const guchar * key, size_t key_len)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
860 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
861 struct HMAC_Context *hctx = purple_cipher_context_get_data(context);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
862 int blocksize, i;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
863 guchar *ipad;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
864 guchar *full_key;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
865
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
866 g_return_if_fail(hctx->hash != NULL);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
867
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
868 g_free(hctx->opad);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
869
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
870 blocksize = hctx->blocksize;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
871 ipad = g_malloc(blocksize);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
872 hctx->opad = g_malloc(blocksize);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
873
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
874 if (key_len > blocksize) {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
875 purple_cipher_context_reset(hctx->hash, NULL);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
876 purple_cipher_context_append(hctx->hash, key, key_len);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
877 full_key = g_malloc(100); /* TODO: Should be enough for now... */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
878 purple_cipher_context_digest(hctx->hash, 100, full_key, &key_len);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
879 } else
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
880 full_key = g_memdup(key, key_len);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
881
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
882 if (key_len < blocksize) {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
883 full_key = g_realloc(full_key, blocksize);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
884 memset(full_key + key_len, 0, blocksize - key_len);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
885 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
886
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
887 for(i = 0; i < blocksize; i++) {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
888 ipad[i] = 0x36 ^ full_key[i];
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
889 hctx->opad[i] = 0x5c ^ full_key[i];
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
890 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
891
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
892 g_free(full_key);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
893
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
894 purple_cipher_context_reset(hctx->hash, NULL);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
895 purple_cipher_context_append(hctx->hash, ipad, blocksize);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
896 g_free(ipad);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
897 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
898
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
899 static void
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
900 hmac_set_key(PurpleCipherContext *context, const guchar * key)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
901 {
22108
cb9819851163 Squash some compiler warnings, some from my -Wstrict-prototypes fixing.
Richard Laager <rlaager@pidgin.im>
parents: 22025
diff changeset
902 hmac_set_key_with_len(context, key, strlen((char *)key));
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
903 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
904
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 25859
diff changeset
905 static size_t
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
906 hmac_get_block_size(PurpleCipherContext *context)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
907 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
908 struct HMAC_Context *hctx = purple_cipher_context_get_data(context);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
909
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
910 return hctx->blocksize;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
911 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
912
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
913 static PurpleCipherOps HMACOps = {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
914 hmac_set_opt, /* Set option */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
915 hmac_get_opt, /* Get option */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
916 hmac_init, /* init */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
917 hmac_reset, /* reset */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
918 hmac_uninit, /* uninit */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
919 NULL, /* set iv */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
920 hmac_append, /* append */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
921 hmac_digest, /* digest */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
922 NULL, /* encrypt */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
923 NULL, /* decrypt */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
924 NULL, /* set salt */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
925 NULL, /* get salt size */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
926 hmac_set_key, /* set key */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
927 NULL, /* get key size */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
928 NULL, /* set batch mode */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
929 NULL, /* get batch mode */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
930 hmac_get_block_size, /* get block size */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
931 hmac_set_key_with_len /* set key with len */
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
932 };
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
933
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
934 /******************************************************************************
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
935 * DES
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
936 *****************************************************************************/
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
937
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
938 typedef struct _des_ctx
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 guint32 encrypt_subkeys[32];
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
941 guint32 decrypt_subkeys[32];
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
942 } des_ctx[1];
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
943
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 * 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
946 */
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
947 static const guint32 sbox1[64] =
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
948 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
949 0x00808200, 0x00000000, 0x00008000, 0x00808202, 0x00808002, 0x00008202, 0x00000002, 0x00008000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
950 0x00000200, 0x00808200, 0x00808202, 0x00000200, 0x00800202, 0x00808002, 0x00800000, 0x00000002,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
951 0x00000202, 0x00800200, 0x00800200, 0x00008200, 0x00008200, 0x00808000, 0x00808000, 0x00800202,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
952 0x00008002, 0x00800002, 0x00800002, 0x00008002, 0x00000000, 0x00000202, 0x00008202, 0x00800000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
953 0x00008000, 0x00808202, 0x00000002, 0x00808000, 0x00808200, 0x00800000, 0x00800000, 0x00000200,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
954 0x00808002, 0x00008000, 0x00008200, 0x00800002, 0x00000200, 0x00000002, 0x00800202, 0x00008202,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
955 0x00808202, 0x00008002, 0x00808000, 0x00800202, 0x00800002, 0x00000202, 0x00008202, 0x00808200,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
956 0x00000202, 0x00800200, 0x00800200, 0x00000000, 0x00008002, 0x00008200, 0x00000000, 0x00808002
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
957 };
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
958
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
959 static const guint32 sbox2[64] =
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
960 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
961 0x40084010, 0x40004000, 0x00004000, 0x00084010, 0x00080000, 0x00000010, 0x40080010, 0x40004010,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
962 0x40000010, 0x40084010, 0x40084000, 0x40000000, 0x40004000, 0x00080000, 0x00000010, 0x40080010,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
963 0x00084000, 0x00080010, 0x40004010, 0x00000000, 0x40000000, 0x00004000, 0x00084010, 0x40080000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
964 0x00080010, 0x40000010, 0x00000000, 0x00084000, 0x00004010, 0x40084000, 0x40080000, 0x00004010,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
965 0x00000000, 0x00084010, 0x40080010, 0x00080000, 0x40004010, 0x40080000, 0x40084000, 0x00004000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
966 0x40080000, 0x40004000, 0x00000010, 0x40084010, 0x00084010, 0x00000010, 0x00004000, 0x40000000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
967 0x00004010, 0x40084000, 0x00080000, 0x40000010, 0x00080010, 0x40004010, 0x40000010, 0x00080010,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
968 0x00084000, 0x00000000, 0x40004000, 0x00004010, 0x40000000, 0x40080010, 0x40084010, 0x00084000
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
969 };
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
970
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
971 static const guint32 sbox3[64] =
11335
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 0x00000104, 0x04010100, 0x00000000, 0x04010004, 0x04000100, 0x00000000, 0x00010104, 0x04000100,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
974 0x00010004, 0x04000004, 0x04000004, 0x00010000, 0x04010104, 0x00010004, 0x04010000, 0x00000104,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
975 0x04000000, 0x00000004, 0x04010100, 0x00000100, 0x00010100, 0x04010000, 0x04010004, 0x00010104,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
976 0x04000104, 0x00010100, 0x00010000, 0x04000104, 0x00000004, 0x04010104, 0x00000100, 0x04000000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
977 0x04010100, 0x04000000, 0x00010004, 0x00000104, 0x00010000, 0x04010100, 0x04000100, 0x00000000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
978 0x00000100, 0x00010004, 0x04010104, 0x04000100, 0x04000004, 0x00000100, 0x00000000, 0x04010004,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
979 0x04000104, 0x00010000, 0x04000000, 0x04010104, 0x00000004, 0x00010104, 0x00010100, 0x04000004,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
980 0x04010000, 0x04000104, 0x00000104, 0x04010000, 0x00010104, 0x00000004, 0x04010004, 0x00010100
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
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
983 static const guint32 sbox4[64] =
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
984 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
985 0x80401000, 0x80001040, 0x80001040, 0x00000040, 0x00401040, 0x80400040, 0x80400000, 0x80001000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
986 0x00000000, 0x00401000, 0x00401000, 0x80401040, 0x80000040, 0x00000000, 0x00400040, 0x80400000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
987 0x80000000, 0x00001000, 0x00400000, 0x80401000, 0x00000040, 0x00400000, 0x80001000, 0x00001040,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
988 0x80400040, 0x80000000, 0x00001040, 0x00400040, 0x00001000, 0x00401040, 0x80401040, 0x80000040,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
989 0x00400040, 0x80400000, 0x00401000, 0x80401040, 0x80000040, 0x00000000, 0x00000000, 0x00401000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
990 0x00001040, 0x00400040, 0x80400040, 0x80000000, 0x80401000, 0x80001040, 0x80001040, 0x00000040,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
991 0x80401040, 0x80000040, 0x80000000, 0x00001000, 0x80400000, 0x80001000, 0x00401040, 0x80400040,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
992 0x80001000, 0x00001040, 0x00400000, 0x80401000, 0x00000040, 0x00400000, 0x00001000, 0x00401040
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
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
995 static const guint32 sbox5[64] =
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
996 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
997 0x00000080, 0x01040080, 0x01040000, 0x21000080, 0x00040000, 0x00000080, 0x20000000, 0x01040000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
998 0x20040080, 0x00040000, 0x01000080, 0x20040080, 0x21000080, 0x21040000, 0x00040080, 0x20000000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
999 0x01000000, 0x20040000, 0x20040000, 0x00000000, 0x20000080, 0x21040080, 0x21040080, 0x01000080,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1000 0x21040000, 0x20000080, 0x00000000, 0x21000000, 0x01040080, 0x01000000, 0x21000000, 0x00040080,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1001 0x00040000, 0x21000080, 0x00000080, 0x01000000, 0x20000000, 0x01040000, 0x21000080, 0x20040080,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1002 0x01000080, 0x20000000, 0x21040000, 0x01040080, 0x20040080, 0x00000080, 0x01000000, 0x21040000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1003 0x21040080, 0x00040080, 0x21000000, 0x21040080, 0x01040000, 0x00000000, 0x20040000, 0x21000000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1004 0x00040080, 0x01000080, 0x20000080, 0x00040000, 0x00000000, 0x20040000, 0x01040080, 0x20000080
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1005 };
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1006
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
1007 static const guint32 sbox6[64] =
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1008 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1009 0x10000008, 0x10200000, 0x00002000, 0x10202008, 0x10200000, 0x00000008, 0x10202008, 0x00200000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1010 0x10002000, 0x00202008, 0x00200000, 0x10000008, 0x00200008, 0x10002000, 0x10000000, 0x00002008,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1011 0x00000000, 0x00200008, 0x10002008, 0x00002000, 0x00202000, 0x10002008, 0x00000008, 0x10200008,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1012 0x10200008, 0x00000000, 0x00202008, 0x10202000, 0x00002008, 0x00202000, 0x10202000, 0x10000000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1013 0x10002000, 0x00000008, 0x10200008, 0x00202000, 0x10202008, 0x00200000, 0x00002008, 0x10000008,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1014 0x00200000, 0x10002000, 0x10000000, 0x00002008, 0x10000008, 0x10202008, 0x00202000, 0x10200000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1015 0x00202008, 0x10202000, 0x00000000, 0x10200008, 0x00000008, 0x00002000, 0x10200000, 0x00202008,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1016 0x00002000, 0x00200008, 0x10002008, 0x00000000, 0x10202000, 0x10000000, 0x00200008, 0x10002008
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1017 };
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1018
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
1019 static const guint32 sbox7[64] =
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1020 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1021 0x00100000, 0x02100001, 0x02000401, 0x00000000, 0x00000400, 0x02000401, 0x00100401, 0x02100400,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1022 0x02100401, 0x00100000, 0x00000000, 0x02000001, 0x00000001, 0x02000000, 0x02100001, 0x00000401,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1023 0x02000400, 0x00100401, 0x00100001, 0x02000400, 0x02000001, 0x02100000, 0x02100400, 0x00100001,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1024 0x02100000, 0x00000400, 0x00000401, 0x02100401, 0x00100400, 0x00000001, 0x02000000, 0x00100400,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1025 0x02000000, 0x00100400, 0x00100000, 0x02000401, 0x02000401, 0x02100001, 0x02100001, 0x00000001,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1026 0x00100001, 0x02000000, 0x02000400, 0x00100000, 0x02100400, 0x00000401, 0x00100401, 0x02100400,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1027 0x00000401, 0x02000001, 0x02100401, 0x02100000, 0x00100400, 0x00000000, 0x00000001, 0x02100401,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1028 0x00000000, 0x00100401, 0x02100000, 0x00000400, 0x02000001, 0x02000400, 0x00000400, 0x00100001
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1029 };
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1030
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
1031 static const guint32 sbox8[64] =
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1032 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1033 0x08000820, 0x00000800, 0x00020000, 0x08020820, 0x08000000, 0x08000820, 0x00000020, 0x08000000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1034 0x00020020, 0x08020000, 0x08020820, 0x00020800, 0x08020800, 0x00020820, 0x00000800, 0x00000020,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1035 0x08020000, 0x08000020, 0x08000800, 0x00000820, 0x00020800, 0x00020020, 0x08020020, 0x08020800,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1036 0x00000820, 0x00000000, 0x00000000, 0x08020020, 0x08000020, 0x08000800, 0x00020820, 0x00020000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1037 0x00020820, 0x00020000, 0x08020800, 0x00000800, 0x00000020, 0x08020020, 0x00000800, 0x00020820,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1038 0x08000800, 0x00000020, 0x08000020, 0x08020000, 0x08020020, 0x08000000, 0x00020000, 0x08000820,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1039 0x00000000, 0x08020820, 0x00020020, 0x08000020, 0x08020000, 0x08000800, 0x08000820, 0x00000000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1040 0x08020820, 0x00020800, 0x00020800, 0x00000820, 0x00000820, 0x00020020, 0x08000000, 0x08020800
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1041 };
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1042
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1043
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1044
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1045 /*
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1046 * * 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
1047 * * In this implementation several speed improvements are done.
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1048 * */
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
1049 static const guint32 leftkey_swap[16] =
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1050 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1051 0x00000000, 0x00000001, 0x00000100, 0x00000101,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1052 0x00010000, 0x00010001, 0x00010100, 0x00010101,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1053 0x01000000, 0x01000001, 0x01000100, 0x01000101,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1054 0x01010000, 0x01010001, 0x01010100, 0x01010101
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1055 };
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1056
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
1057 static const guint32 rightkey_swap[16] =
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1058 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1059 0x00000000, 0x01000000, 0x00010000, 0x01010000,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1060 0x00000100, 0x01000100, 0x00010100, 0x01010100,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1061 0x00000001, 0x01000001, 0x00010001, 0x01010001,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1062 0x00000101, 0x01000101, 0x00010101, 0x01010101,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1063 };
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1064
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1065
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1066
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1067 /*
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1068 * Numbers of left shifts per round for encryption subkey schedule
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1069 * To calculate the decryption key scheduling we just reverse the
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1070 * 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
1071 * subkey schedule.
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1072 */
21091
07fe1a99c47b Patch from Andrew Gaul to constify a bunch of static variables to reduce
Ka-Hing Cheung <khc@pidgin.im>
parents: 19859
diff changeset
1073 static const guint8 encrypt_rotate_tab[16] =
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1074 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1075 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
1076 };
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1077
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1078 /*
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1079 * Macro to swap bits across two words
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1080 **/
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1081 #define DO_PERMUTATION(a, temp, b, offset, mask) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1082 temp = ((a>>offset) ^ b) & mask; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1083 b ^= temp; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1084 a ^= temp<<offset;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1085
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1086
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1087 /*
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1088 * 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
1089 **/
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1090 #define INITIAL_PERMUTATION(left, temp, right) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1091 DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1092 DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1093 DO_PERMUTATION(right, temp, left, 2, 0x33333333) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1094 DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1095 DO_PERMUTATION(left, temp, right, 1, 0x55555555)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1096
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1097
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1098 /*
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1099 * The 'inverse initial permutation'
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1100 **/
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1101 #define FINAL_PERMUTATION(left, temp, right) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1102 DO_PERMUTATION(left, temp, right, 1, 0x55555555) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1103 DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1104 DO_PERMUTATION(right, temp, left, 2, 0x33333333) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1105 DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1106 DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1107
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1108
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1109 /*
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1110 * A full DES round including 'expansion function', 'sbox substitution'
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1111 * 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
1112 **/
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1113 #define DES_ROUND(from, to, work, subkey) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1114 work = ((from<<1) | (from>>31)) ^ *subkey++; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1115 to ^= sbox8[ work & 0x3f ]; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1116 to ^= sbox6[ (work>>8) & 0x3f ]; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1117 to ^= sbox4[ (work>>16) & 0x3f ]; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1118 to ^= sbox2[ (work>>24) & 0x3f ]; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1119 work = ((from>>3) | (from<<29)) ^ *subkey++; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1120 to ^= sbox7[ work & 0x3f ]; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1121 to ^= sbox5[ (work>>8) & 0x3f ]; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1122 to ^= sbox3[ (work>>16) & 0x3f ]; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1123 to ^= sbox1[ (work>>24) & 0x3f ];
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1124
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1125
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1126 /*
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1127 * Macros to convert 8 bytes from/to 32bit words
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1128 **/
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1129 #define READ_64BIT_DATA(data, left, right) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1130 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
1131 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
1132
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1133 #define WRITE_64BIT_DATA(data, left, right) \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1134 data[0] = (left >> 24) &0xff; data[1] = (left >> 16) &0xff; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1135 data[2] = (left >> 8) &0xff; data[3] = left &0xff; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1136 data[4] = (right >> 24) &0xff; data[5] = (right >> 16) &0xff; \
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1137 data[6] = (right >> 8) &0xff; data[7] = right &0xff;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1138
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1139
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1140
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1141
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1142
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1143
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1144 /*
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1145 * des_key_schedule(): Calculate 16 subkeys pairs (even/odd) for
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1146 * 16 encryption rounds.
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1147 * To calculate subkeys for decryption the caller
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1148 * have to reorder the generated subkeys.
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 25859
diff changeset
1149 *
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1150 * rawkey: 8 Bytes of key data
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1151 * subkey: Array of at least 32 guint32s. Will be filled
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1152 * with calculated subkeys.
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 25859
diff changeset
1153 *
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1154 **/
11597
f56c92bee122 [gaim-migrate @ 13867]
Ethan Blanton <elb@pidgin.im>
parents: 11335
diff changeset
1155 static void
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1156 des_key_schedule (const guint8 * rawkey, guint32 * subkey)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1157 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1158 guint32 left, right, work;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1159 int round;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1160
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1161 READ_64BIT_DATA (rawkey, left, right)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1162
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1163 DO_PERMUTATION (right, work, left, 4, 0x0f0f0f0f)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1164 DO_PERMUTATION (right, work, left, 0, 0x10101010)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1165
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1166 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
1167 | (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
1168 | (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
1169 | (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
1170
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1171 left &= 0x0fffffff;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1172
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1173 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
1174 | (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
1175 | (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
1176 | (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
1177
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1178 right &= 0x0fffffff;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1179
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1180 for (round = 0; round < 16; ++round)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1181 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1182 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
1183 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
1184
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1185 *subkey++ = ((left << 4) & 0x24000000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1186 | ((left << 28) & 0x10000000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1187 | ((left << 14) & 0x08000000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1188 | ((left << 18) & 0x02080000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1189 | ((left << 6) & 0x01000000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1190 | ((left << 9) & 0x00200000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1191 | ((left >> 1) & 0x00100000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1192 | ((left << 10) & 0x00040000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1193 | ((left << 2) & 0x00020000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1194 | ((left >> 10) & 0x00010000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1195 | ((right >> 13) & 0x00002000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1196 | ((right >> 4) & 0x00001000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1197 | ((right << 6) & 0x00000800)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1198 | ((right >> 1) & 0x00000400)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1199 | ((right >> 14) & 0x00000200)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1200 | (right & 0x00000100)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1201 | ((right >> 5) & 0x00000020)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1202 | ((right >> 10) & 0x00000010)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1203 | ((right >> 3) & 0x00000008)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1204 | ((right >> 18) & 0x00000004)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1205 | ((right >> 26) & 0x00000002)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1206 | ((right >> 24) & 0x00000001);
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1207
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1208 *subkey++ = ((left << 15) & 0x20000000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1209 | ((left << 17) & 0x10000000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1210 | ((left << 10) & 0x08000000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1211 | ((left << 22) & 0x04000000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1212 | ((left >> 2) & 0x02000000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1213 | ((left << 1) & 0x01000000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1214 | ((left << 16) & 0x00200000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1215 | ((left << 11) & 0x00100000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1216 | ((left << 3) & 0x00080000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1217 | ((left >> 6) & 0x00040000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1218 | ((left << 15) & 0x00020000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1219 | ((left >> 4) & 0x00010000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1220 | ((right >> 2) & 0x00002000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1221 | ((right << 8) & 0x00001000)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1222 | ((right >> 14) & 0x00000808)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1223 | ((right >> 9) & 0x00000400)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1224 | ((right) & 0x00000200)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1225 | ((right << 7) & 0x00000100)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1226 | ((right >> 7) & 0x00000020)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1227 | ((right >> 3) & 0x00000011)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1228 | ((right << 2) & 0x00000004)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1229 | ((right >> 21) & 0x00000002);
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1230 }
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1231 }
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1232
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1233
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1234
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1235 /*
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1236 * 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
1237 * Does not check parity bits, but simply ignore them.
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1238 * Does not check for weak keys.
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1239 **/
11597
f56c92bee122 [gaim-migrate @ 13867]
Ethan Blanton <elb@pidgin.im>
parents: 11335
diff changeset
1240 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1241 des_set_key (PurpleCipherContext *context, const guchar * key)
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1242 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1243 struct _des_ctx *ctx = purple_cipher_context_get_data(context);
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1244 int i;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1245
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1246 des_key_schedule (key, ctx->encrypt_subkeys);
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1247
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1248 for(i=0; i<32; i+=2)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1249 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1250 ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[30-i];
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1251 ctx->decrypt_subkeys[i+1] = ctx->encrypt_subkeys[31-i];
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1252 }
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1253 }
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1254
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1255
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1256
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1257 /*
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1258 * Electronic Codebook Mode DES encryption/decryption of data according
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1259 * to 'mode'.
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1260 **/
11597
f56c92bee122 [gaim-migrate @ 13867]
Ethan Blanton <elb@pidgin.im>
parents: 11335
diff changeset
1261 static int
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1262 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
1263 {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1264 guint32 left, right, work;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1265 guint32 *keys;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1266
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1267 keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1268
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1269 READ_64BIT_DATA (from, left, right)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1270 INITIAL_PERMUTATION (left, work, right)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1271
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1272 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
1273 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
1274 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
1275 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
1276 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
1277 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
1278 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
1279 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
1280
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1281 FINAL_PERMUTATION (right, work, left)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1282 WRITE_64BIT_DATA (to, right, left)
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1283
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1284 return 0;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1285 }
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1286
11597
f56c92bee122 [gaim-migrate @ 13867]
Ethan Blanton <elb@pidgin.im>
parents: 11335
diff changeset
1287 static gint
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1288 des_encrypt(PurpleCipherContext *context, const guchar data[],
11597
f56c92bee122 [gaim-migrate @ 13867]
Ethan Blanton <elb@pidgin.im>
parents: 11335
diff changeset
1289 size_t len, guchar output[], size_t *outlen) {
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1290 int offset = 0;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1291 int i = 0;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1292 int tmp;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1293 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
1294 while(offset+8<=len) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1295 des_ecb_crypt(purple_cipher_context_get_data(context),
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1296 data+offset,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1297 output+offset,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1298 0);
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1299 offset+=8;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1300 }
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1301 *outlen = len;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1302 if(offset<len) {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1303 *outlen += len - offset;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1304 tmp = offset;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1305 while(tmp<len) {
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1306 buf[i++] = data[tmp];
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1307 tmp++;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1308 }
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1309 des_ecb_crypt(purple_cipher_context_get_data(context),
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1310 buf,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1311 output+offset,
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1312 0);
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 25859
diff changeset
1313 }
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1314 return 0;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1315 }
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1316
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1317 static gint
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1318 des_decrypt(PurpleCipherContext *context, const guchar data[],
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1319 size_t len, guchar output[], size_t *outlen) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1320 int offset = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1321 int i = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1322 int tmp;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1323 guint8 buf[8] = {0,0,0,0,0,0,0,0};
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1324 while(offset+8<=len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1325 des_ecb_crypt(purple_cipher_context_get_data(context),
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1326 data+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1327 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1328 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1329 offset+=8;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1330 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1331 *outlen = len;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1332 if(offset<len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1333 *outlen += len - offset;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1334 tmp = offset;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1335 while(tmp<len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1336 buf[i++] = data[tmp];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1337 tmp++;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1338 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1339 des_ecb_crypt(purple_cipher_context_get_data(context),
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1340 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1341 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1342 1);
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 25859
diff changeset
1343 }
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1344 return 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1345 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1346
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1347 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1348 des_init(PurpleCipherContext *context, gpointer extra) {
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1349 struct _des_ctx *mctx;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1350 mctx = g_new0(struct _des_ctx, 1);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1351 purple_cipher_context_set_data(context, mctx);
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1352 }
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1353
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1354 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1355 des_uninit(PurpleCipherContext *context) {
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1356 struct _des_ctx *des_context;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1357
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1358 des_context = purple_cipher_context_get_data(context);
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1359 memset(des_context, 0, sizeof(des_context));
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1360
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1361 g_free(des_context);
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1362 des_context = NULL;
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1363 }
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1364
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1365 static PurpleCipherOps DESOps = {
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1366 NULL, /* Set option */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1367 NULL, /* Get option */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1368 des_init, /* init */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1369 NULL, /* reset */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1370 des_uninit, /* uninit */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1371 NULL, /* set iv */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1372 NULL, /* append */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1373 NULL, /* digest */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1374 des_encrypt, /* encrypt */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1375 des_decrypt, /* decrypt */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1376 NULL, /* set salt */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1377 NULL, /* get salt size */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1378 des_set_key, /* set key */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1379 NULL, /* get key size */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1380 NULL, /* set batch mode */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1381 NULL, /* get batch mode */
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
1382 NULL, /* get block size */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
1383 NULL /* set key with len */
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1384 };
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1385
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1386 /******************************************************************************
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1387 * Triple-DES
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1388 *****************************************************************************/
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1389
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1390 typedef struct _des3_ctx
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1391 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1392 PurpleCipherBatchMode mode;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1393 guchar iv[8];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1394 /* First key for encryption */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1395 struct _des_ctx key1;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1396 /* Second key for decryption */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1397 struct _des_ctx key2;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1398 /* Third key for encryption */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1399 struct _des_ctx key3;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1400 } des3_ctx[1];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1401
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1402 /*
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1403 * Fill a DES3 context with subkeys calculated from 3 64bit key.
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1404 * Does not check parity bits, but simply ignore them.
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1405 * Does not check for weak keys.
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1406 **/
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1407 static void
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1408 des3_set_key(PurpleCipherContext *context, const guchar * key)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1409 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1410 struct _des3_ctx *ctx = purple_cipher_context_get_data(context);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1411 int i;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1412
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1413 des_key_schedule (key + 0, ctx->key1.encrypt_subkeys);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1414 des_key_schedule (key + 8, ctx->key2.encrypt_subkeys);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1415 des_key_schedule (key + 16, ctx->key3.encrypt_subkeys);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1416
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1417 for (i = 0; i < 32; i += 2)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1418 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1419 ctx->key1.decrypt_subkeys[i] = ctx->key1.encrypt_subkeys[30-i];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1420 ctx->key1.decrypt_subkeys[i+1] = ctx->key1.encrypt_subkeys[31-i];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1421 ctx->key2.decrypt_subkeys[i] = ctx->key2.encrypt_subkeys[30-i];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1422 ctx->key2.decrypt_subkeys[i+1] = ctx->key2.encrypt_subkeys[31-i];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1423 ctx->key3.decrypt_subkeys[i] = ctx->key3.encrypt_subkeys[30-i];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1424 ctx->key3.decrypt_subkeys[i+1] = ctx->key3.encrypt_subkeys[31-i];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1425 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1426 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1427
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1428 static gint
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1429 des3_ecb_encrypt(struct _des3_ctx *ctx, const guchar data[],
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1430 size_t len, guchar output[], size_t *outlen)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1431 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1432 int offset = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1433 int i = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1434 int tmp;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1435 guint8 buf[8] = {0,0,0,0,0,0,0,0};
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1436 while (offset + 8 <= len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1437 des_ecb_crypt(&ctx->key1,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1438 data+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1439 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1440 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1441 des_ecb_crypt(&ctx->key2,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1442 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1443 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1444 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1445 des_ecb_crypt(&ctx->key3,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1446 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1447 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1448 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1449 offset += 8;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1450 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1451 *outlen = len;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1452 if (offset < len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1453 *outlen += len - offset;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1454 tmp = offset;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1455 memset(buf, 0, 8);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1456 while (tmp < len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1457 buf[i++] = data[tmp];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1458 tmp++;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1459 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1460 des_ecb_crypt(&ctx->key1,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1461 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1462 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1463 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1464 des_ecb_crypt(&ctx->key2,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1465 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1466 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1467 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1468 des_ecb_crypt(&ctx->key3,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1469 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1470 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1471 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1472 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1473 return 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1474 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1475
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1476 static gint
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1477 des3_cbc_encrypt(struct _des3_ctx *ctx, const guchar data[],
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1478 size_t len, guchar output[], size_t *outlen)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1479 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1480 int offset = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1481 int i = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1482 int tmp;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1483 guint8 buf[8];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1484 memcpy(buf, ctx->iv, 8);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1485 while (offset + 8 <= len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1486 for (i = 0; i < 8; i++)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1487 buf[i] ^= data[offset + i];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1488 des_ecb_crypt(&ctx->key1,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1489 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1490 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1491 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1492 des_ecb_crypt(&ctx->key2,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1493 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1494 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1495 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1496 des_ecb_crypt(&ctx->key3,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1497 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1498 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1499 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1500 memcpy(buf, output+offset, 8);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1501 offset += 8;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1502 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1503 *outlen = len;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1504 if (offset < len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1505 *outlen += len - offset;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1506 tmp = offset;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1507 i = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1508 while (tmp < len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1509 buf[i++] ^= data[tmp];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1510 tmp++;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1511 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1512 des_ecb_crypt(&ctx->key1,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1513 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1514 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1515 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1516 des_ecb_crypt(&ctx->key2,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1517 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1518 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1519 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1520 des_ecb_crypt(&ctx->key3,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1521 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1522 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1523 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1524 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1525 return 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1526 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1527
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1528 static gint
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1529 des3_encrypt(PurpleCipherContext *context, const guchar data[],
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1530 size_t len, guchar output[], size_t *outlen)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1531 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1532 struct _des3_ctx *ctx = purple_cipher_context_get_data(context);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1533
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1534 if (ctx->mode == PURPLE_CIPHER_BATCH_MODE_ECB) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1535 return des3_ecb_encrypt(ctx, data, len, output, outlen);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1536 } else if (ctx->mode == PURPLE_CIPHER_BATCH_MODE_CBC) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1537 return des3_cbc_encrypt(ctx, data, len, output, outlen);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1538 } else {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1539 g_return_val_if_reached(0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1540 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1541
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1542 return 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1543 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1544
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1545 static gint
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1546 des3_ecb_decrypt(struct _des3_ctx *ctx, const guchar data[],
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1547 size_t len, guchar output[], size_t *outlen)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1548 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1549 int offset = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1550 int i = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1551 int tmp;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1552 guint8 buf[8] = {0,0,0,0,0,0,0,0};
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1553 while (offset + 8 <= len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1554 /* NOTE: Apply key in reverse */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1555 des_ecb_crypt(&ctx->key3,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1556 data+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1557 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1558 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1559 des_ecb_crypt(&ctx->key2,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1560 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1561 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1562 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1563 des_ecb_crypt(&ctx->key1,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1564 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1565 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1566 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1567 offset+=8;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1568 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1569 *outlen = len;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1570 if (offset < len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1571 *outlen += len - offset;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1572 tmp = offset;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1573 memset(buf, 0, 8);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1574 while (tmp < len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1575 buf[i++] = data[tmp];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1576 tmp++;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1577 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1578 des_ecb_crypt(&ctx->key3,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1579 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1580 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1581 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1582 des_ecb_crypt(&ctx->key2,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1583 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1584 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1585 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1586 des_ecb_crypt(&ctx->key1,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1587 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1588 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1589 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1590 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1591 return 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1592 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1593
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1594 static gint
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1595 des3_cbc_decrypt(struct _des3_ctx *ctx, const guchar data[],
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1596 size_t len, guchar output[], size_t *outlen)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1597 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1598 int offset = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1599 int i = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1600 int tmp;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1601 guint8 buf[8] = {0,0,0,0,0,0,0,0};
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1602 guint8 link[8];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1603 memcpy(link, ctx->iv, 8);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1604 while (offset + 8 <= len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1605 des_ecb_crypt(&ctx->key3,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1606 data+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1607 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1608 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1609 des_ecb_crypt(&ctx->key2,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1610 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1611 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1612 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1613 des_ecb_crypt(&ctx->key1,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1614 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1615 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1616 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1617 for (i = 0; i < 8; i++)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1618 output[offset + i] ^= link[i];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1619 memcpy(link, data + offset, 8);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1620 offset+=8;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1621 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1622 *outlen = len;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1623 if(offset<len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1624 *outlen += len - offset;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1625 tmp = offset;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1626 memset(buf, 0, 8);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1627 i = 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1628 while(tmp<len) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1629 buf[i++] = data[tmp];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1630 tmp++;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1631 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1632 des_ecb_crypt(&ctx->key3,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1633 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1634 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1635 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1636 des_ecb_crypt(&ctx->key2,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1637 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1638 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1639 0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1640 des_ecb_crypt(&ctx->key1,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1641 buf,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1642 output+offset,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1643 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1644 for (i = 0; i < 8; i++)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1645 output[offset + i] ^= link[i];
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1646 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1647 return 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1648 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1649
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1650 static gint
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1651 des3_decrypt(PurpleCipherContext *context, const guchar data[],
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1652 size_t len, guchar output[], size_t *outlen)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1653 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1654 struct _des3_ctx *ctx = purple_cipher_context_get_data(context);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1655
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1656 if (ctx->mode == PURPLE_CIPHER_BATCH_MODE_ECB) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1657 return des3_ecb_decrypt(ctx, data, len, output, outlen);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1658 } else if (ctx->mode == PURPLE_CIPHER_BATCH_MODE_CBC) {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1659 return des3_cbc_decrypt(ctx, data, len, output, outlen);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1660 } else {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1661 g_return_val_if_reached(0);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1662 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1663
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1664 return 0;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1665 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1666
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1667 static void
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1668 des3_set_batch(PurpleCipherContext *context, PurpleCipherBatchMode mode)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1669 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1670 struct _des3_ctx *ctx = purple_cipher_context_get_data(context);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1671
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1672 ctx->mode = mode;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1673 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1674
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1675 static PurpleCipherBatchMode
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1676 des3_get_batch(PurpleCipherContext *context)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1677 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1678 struct _des3_ctx *ctx = purple_cipher_context_get_data(context);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1679
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1680 return ctx->mode;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1681 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1682
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1683 static void
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1684 des3_set_iv(PurpleCipherContext *context, guchar *iv, size_t len)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1685 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1686 struct _des3_ctx *ctx;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1687
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1688 g_return_if_fail(len == 8);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1689
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1690 ctx = purple_cipher_context_get_data(context);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1691
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1692 memcpy(ctx->iv, iv, len);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1693 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1694
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1695 static void
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1696 des3_init(PurpleCipherContext *context, gpointer extra)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1697 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1698 struct _des3_ctx *mctx;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1699 mctx = g_new0(struct _des3_ctx, 1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1700 purple_cipher_context_set_data(context, mctx);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1701 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1702
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1703 static void
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1704 des3_uninit(PurpleCipherContext *context)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1705 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1706 struct _des3_ctx *des3_context;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1707
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1708 des3_context = purple_cipher_context_get_data(context);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1709 memset(des3_context, 0, sizeof(des3_context));
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1710
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1711 g_free(des3_context);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1712 des3_context = NULL;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1713 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1714
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1715 static PurpleCipherOps DES3Ops = {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1716 NULL, /* Set option */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1717 NULL, /* Get option */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1718 des3_init, /* init */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1719 NULL, /* reset */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1720 des3_uninit, /* uninit */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1721 des3_set_iv, /* set iv */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1722 NULL, /* append */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1723 NULL, /* digest */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1724 des3_encrypt, /* encrypt */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1725 des3_decrypt, /* decrypt */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1726 NULL, /* set salt */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1727 NULL, /* get salt size */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1728 des3_set_key, /* set key */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1729 NULL, /* get key size */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1730 des3_set_batch, /* set batch mode */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
1731 des3_get_batch, /* get batch mode */
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
1732 NULL, /* get block size */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
1733 NULL /* set key with len */
11335
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1734 };
8e8d266179bb [gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11333
diff changeset
1735
11329
5ca3cf4e502e [gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents: 11183
diff changeset
1736 /*******************************************************************************
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1737 * SHA-1
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1738 ******************************************************************************/
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
1739 #define SHA1_HMAC_BLOCK_SIZE 64
27539
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1740
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1741 static size_t
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1742 sha1_get_block_size(PurpleCipherContext *context)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1743 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1744 /* This does not change (in this case) */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1745 return SHA1_HMAC_BLOCK_SIZE;
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1746 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1747
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1748
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1749 #if GLIB_CHECK_VERSION(2,16,0)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1750
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1751 static void
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1752 sha1_init(PurpleCipherContext *context, void *extra)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1753 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1754 purple_g_checksum_init(context, G_CHECKSUM_SHA1);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1755 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1756
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1757 static void
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1758 sha1_reset(PurpleCipherContext *context, void *extra)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1759 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1760 purple_g_checksum_reset(context, G_CHECKSUM_SHA1);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1761 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1762
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1763 static gboolean
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1764 sha1_digest(PurpleCipherContext *context, gsize in_len, guchar digest[20],
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1765 gsize *out_len)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1766 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1767 return purple_g_checksum_digest(context, G_CHECKSUM_SHA1, in_len,
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1768 digest, out_len);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1769 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1770
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1771 static PurpleCipherOps SHA1Ops = {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1772 NULL, /* Set Option */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1773 NULL, /* Get Option */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1774 sha1_init, /* init */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1775 sha1_reset, /* reset */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1776 purple_g_checksum_uninit, /* uninit */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1777 NULL, /* set iv */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1778 purple_g_checksum_append, /* append */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1779 sha1_digest, /* digest */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1780 NULL, /* encrypt */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1781 NULL, /* decrypt */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1782 NULL, /* set salt */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1783 NULL, /* get salt size */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1784 NULL, /* set key */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1785 NULL, /* get key size */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1786 NULL, /* set batch mode */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1787 NULL, /* get batch mode */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1788 sha1_get_block_size, /* get block size */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1789 NULL /* set key with len */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1790 };
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1791
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1792 #else /* GLIB_CHECK_VERSION(2,16,0) */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1793
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
1794 #define SHA1_HMAC_BLOCK_SIZE 64
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1795 #define SHA1_ROTL(X,n) ((((X) << (n)) | ((X) >> (32-(n)))) & 0xFFFFFFFF)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1796
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1797 struct SHA1Context {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1798 guint32 H[5];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1799 guint32 W[80];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1800
13219
5b0a1fd8bc84 [gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents: 12389
diff changeset
1801 gint lenW;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1802
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1803 guint32 sizeHi;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1804 guint32 sizeLo;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1805 };
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1806
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1807 static void
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1808 sha1_hash_block(struct SHA1Context *sha1_ctx) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1809 gint i;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1810 guint32 A, B, C, D, E, T;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1811
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1812 for(i = 16; i < 80; i++) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1813 sha1_ctx->W[i] = SHA1_ROTL(sha1_ctx->W[i - 3] ^
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1814 sha1_ctx->W[i - 8] ^
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1815 sha1_ctx->W[i - 14] ^
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1816 sha1_ctx->W[i - 16], 1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1817 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1818
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1819 A = sha1_ctx->H[0];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1820 B = sha1_ctx->H[1];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1821 C = sha1_ctx->H[2];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1822 D = sha1_ctx->H[3];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1823 E = sha1_ctx->H[4];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1824
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1825 for(i = 0; i < 20; i++) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1826 T = (SHA1_ROTL(A, 5) + (((C ^ D) & B) ^ D) + E + sha1_ctx->W[i] + 0x5A827999) & 0xFFFFFFFF;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1827 E = D;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1828 D = C;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1829 C = SHA1_ROTL(B, 30);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1830 B = A;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1831 A = T;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1832 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1833
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1834 for(i = 20; i < 40; i++) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1835 T = (SHA1_ROTL(A, 5) + (B ^ C ^ D) + E + sha1_ctx->W[i] + 0x6ED9EBA1) & 0xFFFFFFFF;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1836 E = D;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1837 D = C;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1838 C = SHA1_ROTL(B, 30);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1839 B = A;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1840 A = T;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1841 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1842
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1843 for(i = 40; i < 60; i++) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1844 T = (SHA1_ROTL(A, 5) + ((B & C) | (D & (B | C))) + E + sha1_ctx->W[i] + 0x8F1BBCDC) & 0xFFFFFFFF;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1845 E = D;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1846 D = C;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1847 C = SHA1_ROTL(B, 30);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1848 B = A;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1849 A = T;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1850 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1851
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1852 for(i = 60; i < 80; i++) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1853 T = (SHA1_ROTL(A, 5) + (B ^ C ^ D) + E + sha1_ctx->W[i] + 0xCA62C1D6) & 0xFFFFFFFF;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1854 E = D;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1855 D = C;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1856 C = SHA1_ROTL(B, 30);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1857 B = A;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1858 A = T;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1859 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1860
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1861 sha1_ctx->H[0] += A;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1862 sha1_ctx->H[1] += B;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1863 sha1_ctx->H[2] += C;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1864 sha1_ctx->H[3] += D;
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1865 sha1_ctx->H[4] += E;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1866 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1867
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1868 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1869 sha1_set_opt(PurpleCipherContext *context, const gchar *name, void *value) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1870 struct SHA1Context *ctx;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1871
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1872 ctx = purple_cipher_context_get_data(context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1873
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 23867
diff changeset
1874 if(purple_strequal(name, "sizeHi")) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1875 ctx->sizeHi = GPOINTER_TO_INT(value);
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 23867
diff changeset
1876 } else if(purple_strequal(name, "sizeLo")) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1877 ctx->sizeLo = GPOINTER_TO_INT(value);
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 23867
diff changeset
1878 } else if(purple_strequal(name, "lenW")) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1879 ctx->lenW = GPOINTER_TO_INT(value);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1880 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1881 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1882
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1883 static void *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1884 sha1_get_opt(PurpleCipherContext *context, const gchar *name) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1885 struct SHA1Context *ctx;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1886
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1887 ctx = purple_cipher_context_get_data(context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1888
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 23867
diff changeset
1889 if(purple_strequal(name, "sizeHi")) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1890 return GINT_TO_POINTER(ctx->sizeHi);
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 23867
diff changeset
1891 } else if(purple_strequal(name, "sizeLo")) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1892 return GINT_TO_POINTER(ctx->sizeLo);
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 23867
diff changeset
1893 } else if(purple_strequal(name, "lenW")) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1894 return GINT_TO_POINTER(ctx->lenW);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1895 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1896
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1897 return NULL;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1898 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1899
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1900 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1901 sha1_init(PurpleCipherContext *context, void *extra) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1902 struct SHA1Context *sha1_ctx;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1903
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1904 sha1_ctx = g_new0(struct SHA1Context, 1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1905
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1906 purple_cipher_context_set_data(context, sha1_ctx);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1907
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1908 purple_cipher_context_reset(context, extra);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1909 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1910
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1911 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1912 sha1_reset(PurpleCipherContext *context, void *extra) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1913 struct SHA1Context *sha1_ctx;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1914 gint i;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1915
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1916 sha1_ctx = purple_cipher_context_get_data(context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1917
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1918 g_return_if_fail(sha1_ctx);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1919
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1920 sha1_ctx->lenW = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1921 sha1_ctx->sizeHi = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1922 sha1_ctx->sizeLo = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1923
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1924 sha1_ctx->H[0] = 0x67452301;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1925 sha1_ctx->H[1] = 0xEFCDAB89;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1926 sha1_ctx->H[2] = 0x98BADCFE;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1927 sha1_ctx->H[3] = 0x10325476;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1928 sha1_ctx->H[4] = 0xC3D2E1F0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1929
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1930 for(i = 0; i < 80; i++)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1931 sha1_ctx->W[i] = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1932 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1933
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1934 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1935 sha1_uninit(PurpleCipherContext *context) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1936 struct SHA1Context *sha1_ctx;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1937
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1938 purple_cipher_context_reset(context, NULL);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1939
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1940 sha1_ctx = purple_cipher_context_get_data(context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1941
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1942 memset(sha1_ctx, 0, sizeof(struct SHA1Context));
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1943
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1944 g_free(sha1_ctx);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1945 sha1_ctx = NULL;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1946 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1947
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1948
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1949 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1950 sha1_append(PurpleCipherContext *context, const guchar *data, size_t len) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1951 struct SHA1Context *sha1_ctx;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1952 gint i;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1953
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1954 sha1_ctx = purple_cipher_context_get_data(context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1955
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1956 g_return_if_fail(sha1_ctx);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1957
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1958 for(i = 0; i < len; i++) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1959 sha1_ctx->W[sha1_ctx->lenW / 4] <<= 8;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1960 sha1_ctx->W[sha1_ctx->lenW / 4] |= data[i];
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1961
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1962 if((++sha1_ctx->lenW) % 64 == 0) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1963 sha1_hash_block(sha1_ctx);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1964 sha1_ctx->lenW = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1965 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1966
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1967 sha1_ctx->sizeLo += 8;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1968 sha1_ctx->sizeHi += (sha1_ctx->sizeLo < 8);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1969 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1970 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1971
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1972 static gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1973 sha1_digest(PurpleCipherContext *context, size_t in_len, guchar digest[20],
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
1974 size_t *out_len)
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
1975 {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1976 struct SHA1Context *sha1_ctx;
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1977 guchar pad0x80 = 0x80, pad0x00 = 0x00;
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1978 guchar padlen[8];
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1979 gint i;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1980
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
1981 g_return_val_if_fail(in_len >= 20, FALSE);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1982
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1983 sha1_ctx = purple_cipher_context_get_data(context);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1984
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1985 g_return_val_if_fail(sha1_ctx, FALSE);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1986
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1987 padlen[0] = (guchar)((sha1_ctx->sizeHi >> 24) & 255);
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1988 padlen[1] = (guchar)((sha1_ctx->sizeHi >> 16) & 255);
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1989 padlen[2] = (guchar)((sha1_ctx->sizeHi >> 8) & 255);
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1990 padlen[3] = (guchar)((sha1_ctx->sizeHi >> 0) & 255);
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1991 padlen[4] = (guchar)((sha1_ctx->sizeLo >> 24) & 255);
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1992 padlen[5] = (guchar)((sha1_ctx->sizeLo >> 16) & 255);
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1993 padlen[6] = (guchar)((sha1_ctx->sizeLo >> 8) & 255);
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
1994 padlen[7] = (guchar)((sha1_ctx->sizeLo >> 0) & 255);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1995
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1996 /* pad with a 1, then zeroes, then length */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1997 purple_cipher_context_append(context, &pad0x80, 1);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
1998 while(sha1_ctx->lenW != 56)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1999 purple_cipher_context_append(context, &pad0x00, 1);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2000 purple_cipher_context_append(context, padlen, 8);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2001
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2002 for(i = 0; i < 20; i++) {
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
2003 digest[i] = (guchar)(sha1_ctx->H[i / 4] >> 24);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2004 sha1_ctx->H[i / 4] <<= 8;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2005 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2006
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2007 purple_cipher_context_reset(context, NULL);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2008
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2009 if(out_len)
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2010 *out_len = 20;
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2011
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2012 return TRUE;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2013 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2014
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2015 static PurpleCipherOps SHA1Ops = {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2016 sha1_set_opt, /* Set Option */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2017 sha1_get_opt, /* Get Option */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2018 sha1_init, /* init */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2019 sha1_reset, /* reset */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2020 sha1_uninit, /* uninit */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2021 NULL, /* set iv */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2022 sha1_append, /* append */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2023 sha1_digest, /* digest */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2024 NULL, /* encrypt */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2025 NULL, /* decrypt */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2026 NULL, /* set salt */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2027 NULL, /* get salt size */
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2028 NULL, /* set key */
16747
fc3608e1e661 I _think_ this is it for libpurple's padding...
Gary Kramlich <grim@reaperworld.com>
parents: 15884
diff changeset
2029 NULL, /* get key size */
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
2030 NULL, /* set batch mode */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
2031 NULL, /* get batch mode */
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
2032 sha1_get_block_size, /* get block size */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
2033 NULL /* set key with len */
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2034 };
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2035
27539
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2036 #endif /* GLIB_CHECK_VERSION(2,16,0) */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2037
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2038 /*******************************************************************************
27383
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2039 * SHA-256
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2040 ******************************************************************************/
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2041 #define SHA256_HMAC_BLOCK_SIZE 64
27539
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2042
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2043 static size_t
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2044 sha256_get_block_size(PurpleCipherContext *context)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2045 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2046 /* This does not change (in this case) */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2047 return SHA256_HMAC_BLOCK_SIZE;
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2048 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2049
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2050 #if GLIB_CHECK_VERSION(2,16,0)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2051
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2052 static void
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2053 sha256_init(PurpleCipherContext *context, void *extra)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2054 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2055 purple_g_checksum_init(context, G_CHECKSUM_SHA256);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2056 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2057
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2058 static void
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2059 sha256_reset(PurpleCipherContext *context, void *extra)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2060 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2061 purple_g_checksum_reset(context, G_CHECKSUM_SHA256);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2062 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2063
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2064 static gboolean
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2065 sha256_digest(PurpleCipherContext *context, gsize in_len, guchar digest[20],
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2066 gsize *out_len)
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2067 {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2068 return purple_g_checksum_digest(context, G_CHECKSUM_SHA256, in_len,
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2069 digest, out_len);
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2070 }
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2071
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2072 static PurpleCipherOps SHA256Ops = {
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2073 NULL, /* Set Option */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2074 NULL, /* Get Option */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2075 sha256_init, /* init */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2076 sha256_reset, /* reset */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2077 purple_g_checksum_uninit, /* uninit */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2078 NULL, /* set iv */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2079 purple_g_checksum_append, /* append */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2080 sha256_digest, /* digest */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2081 NULL, /* encrypt */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2082 NULL, /* decrypt */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2083 NULL, /* set salt */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2084 NULL, /* get salt size */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2085 NULL, /* set key */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2086 NULL, /* get key size */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2087 NULL, /* set batch mode */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2088 NULL, /* get batch mode */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2089 sha256_get_block_size, /* get block size */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2090 NULL /* set key with len */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2091 };
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2092
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2093 #else /* GLIB_CHECK_VERSION(2,16,0) */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2094
27383
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2095 #define SHA256_ROTR(X,n) ((((X) >> (n)) | ((X) << (32-(n)))) & 0xFFFFFFFF)
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2096
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2097 static const guint32 sha256_K[64] =
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2098 {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2099 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2100 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2101 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2102 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2103 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2104 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2105 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2106 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2107 };
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2108
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2109 struct SHA256Context {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2110 guint32 H[8];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2111 guint32 W[64];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2112
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2113 gint lenW;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2114
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2115 guint32 sizeHi;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2116 guint32 sizeLo;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2117 };
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2118
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2119 static void
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2120 sha256_hash_block(struct SHA256Context *sha256_ctx) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2121 gint i;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2122 guint32 A, B, C, D, E, F, G, H, T1, T2;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2123
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2124 for(i = 16; i < 64; i++) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2125 sha256_ctx->W[i] =
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2126 (SHA256_ROTR(sha256_ctx->W[i-2], 17) ^ SHA256_ROTR(sha256_ctx->W[i-2], 19) ^ (sha256_ctx->W[i-2] >> 10))
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2127 + sha256_ctx->W[i-7]
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2128 + (SHA256_ROTR(sha256_ctx->W[i-15], 7) ^ SHA256_ROTR(sha256_ctx->W[i-15], 18) ^ (sha256_ctx->W[i-15] >> 3))
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2129 + sha256_ctx->W[i-16];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2130 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2131
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2132 A = sha256_ctx->H[0];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2133 B = sha256_ctx->H[1];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2134 C = sha256_ctx->H[2];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2135 D = sha256_ctx->H[3];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2136 E = sha256_ctx->H[4];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2137 F = sha256_ctx->H[5];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2138 G = sha256_ctx->H[6];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2139 H = sha256_ctx->H[7];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2140
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2141 for(i = 0; i < 64; i++) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2142 T1 = H
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2143 + (SHA256_ROTR(E, 6) ^ SHA256_ROTR(E, 11) ^ SHA256_ROTR(E, 25))
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2144 + ((E & F) ^ ((~E) & G))
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2145 + sha256_K[i] + sha256_ctx->W[i];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2146 T2 = (SHA256_ROTR(A, 2) ^ SHA256_ROTR(A, 13) ^ SHA256_ROTR(A, 22))
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2147 + ((A & B) ^ (A & C) ^ (B & C));
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2148 H = G;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2149 G = F;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2150 F = E;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2151 E = D + T1;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2152 D = C;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2153 C = B;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2154 B = A;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2155 A = T1 + T2;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2156 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2157
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2158 sha256_ctx->H[0] += A;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2159 sha256_ctx->H[1] += B;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2160 sha256_ctx->H[2] += C;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2161 sha256_ctx->H[3] += D;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2162 sha256_ctx->H[4] += E;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2163 sha256_ctx->H[5] += F;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2164 sha256_ctx->H[6] += G;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2165 sha256_ctx->H[7] += H;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2166 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2167
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2168 static void
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2169 sha256_set_opt(PurpleCipherContext *context, const gchar *name, void *value) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2170 struct SHA256Context *ctx;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2171
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2172 ctx = purple_cipher_context_get_data(context);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2173
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2174 if(!strcmp(name, "sizeHi")) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2175 ctx->sizeHi = GPOINTER_TO_INT(value);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2176 } else if(!strcmp(name, "sizeLo")) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2177 ctx->sizeLo = GPOINTER_TO_INT(value);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2178 } else if(!strcmp(name, "lenW")) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2179 ctx->lenW = GPOINTER_TO_INT(value);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2180 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2181 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2182
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2183 static void *
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2184 sha256_get_opt(PurpleCipherContext *context, const gchar *name) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2185 struct SHA256Context *ctx;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2186
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2187 ctx = purple_cipher_context_get_data(context);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2188
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2189 if(!strcmp(name, "sizeHi")) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2190 return GINT_TO_POINTER(ctx->sizeHi);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2191 } else if(!strcmp(name, "sizeLo")) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2192 return GINT_TO_POINTER(ctx->sizeLo);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2193 } else if(!strcmp(name, "lenW")) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2194 return GINT_TO_POINTER(ctx->lenW);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2195 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2196
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2197 return NULL;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2198 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2199
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2200 static void
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2201 sha256_init(PurpleCipherContext *context, void *extra) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2202 struct SHA256Context *sha256_ctx;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2203
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2204 sha256_ctx = g_new0(struct SHA256Context, 1);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2205
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2206 purple_cipher_context_set_data(context, sha256_ctx);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2207
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2208 purple_cipher_context_reset(context, extra);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2209 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2210
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2211 static void
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2212 sha256_reset(PurpleCipherContext *context, void *extra) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2213 struct SHA256Context *sha256_ctx;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2214 gint i;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2215
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2216 sha256_ctx = purple_cipher_context_get_data(context);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2217
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2218 g_return_if_fail(sha256_ctx);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2219
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2220 sha256_ctx->lenW = 0;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2221 sha256_ctx->sizeHi = 0;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2222 sha256_ctx->sizeLo = 0;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2223
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2224 sha256_ctx->H[0] = 0x6a09e667;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2225 sha256_ctx->H[1] = 0xbb67ae85;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2226 sha256_ctx->H[2] = 0x3c6ef372;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2227 sha256_ctx->H[3] = 0xa54ff53a;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2228 sha256_ctx->H[4] = 0x510e527f;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2229 sha256_ctx->H[5] = 0x9b05688c;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2230 sha256_ctx->H[6] = 0x1f83d9ab;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2231 sha256_ctx->H[7] = 0x5be0cd19;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2232
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2233 for(i = 0; i < 64; i++)
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2234 sha256_ctx->W[i] = 0;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2235 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2236
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2237 static void
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2238 sha256_uninit(PurpleCipherContext *context) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2239 struct SHA256Context *sha256_ctx;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2240
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2241 purple_cipher_context_reset(context, NULL);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2242
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2243 sha256_ctx = purple_cipher_context_get_data(context);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2244
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2245 memset(sha256_ctx, 0, sizeof(struct SHA256Context));
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2246
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2247 g_free(sha256_ctx);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2248 sha256_ctx = NULL;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2249 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2250
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2251
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2252 static void
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2253 sha256_append(PurpleCipherContext *context, const guchar *data, size_t len) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2254 struct SHA256Context *sha256_ctx;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2255 gint i;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2256
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2257 sha256_ctx = purple_cipher_context_get_data(context);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2258
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2259 g_return_if_fail(sha256_ctx);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2260
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2261 for(i = 0; i < len; i++) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2262 sha256_ctx->W[sha256_ctx->lenW / 4] <<= 8;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2263 sha256_ctx->W[sha256_ctx->lenW / 4] |= data[i];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2264
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2265 if((++sha256_ctx->lenW) % 64 == 0) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2266 sha256_hash_block(sha256_ctx);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2267 sha256_ctx->lenW = 0;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2268 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2269
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2270 sha256_ctx->sizeLo += 8;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2271 sha256_ctx->sizeHi += (sha256_ctx->sizeLo < 8);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2272 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2273 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2274
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2275 static gboolean
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2276 sha256_digest(PurpleCipherContext *context, size_t in_len, guchar digest[32],
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2277 size_t *out_len)
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2278 {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2279 struct SHA256Context *sha256_ctx;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2280 guchar pad0x80 = 0x80, pad0x00 = 0x00;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2281 guchar padlen[8];
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2282 gint i;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2283
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2284 g_return_val_if_fail(in_len >= 32, FALSE);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2285
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2286 sha256_ctx = purple_cipher_context_get_data(context);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2287
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2288 g_return_val_if_fail(sha256_ctx, FALSE);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2289
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2290 padlen[0] = (guchar)((sha256_ctx->sizeHi >> 24) & 255);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2291 padlen[1] = (guchar)((sha256_ctx->sizeHi >> 16) & 255);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2292 padlen[2] = (guchar)((sha256_ctx->sizeHi >> 8) & 255);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2293 padlen[3] = (guchar)((sha256_ctx->sizeHi >> 0) & 255);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2294 padlen[4] = (guchar)((sha256_ctx->sizeLo >> 24) & 255);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2295 padlen[5] = (guchar)((sha256_ctx->sizeLo >> 16) & 255);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2296 padlen[6] = (guchar)((sha256_ctx->sizeLo >> 8) & 255);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2297 padlen[7] = (guchar)((sha256_ctx->sizeLo >> 0) & 255);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2298
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2299 /* pad with a 1, then zeroes, then length */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2300 purple_cipher_context_append(context, &pad0x80, 1);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2301 while(sha256_ctx->lenW != 56)
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2302 purple_cipher_context_append(context, &pad0x00, 1);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2303 purple_cipher_context_append(context, padlen, 8);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2304
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2305 for(i = 0; i < 32; i++) {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2306 digest[i] = (guchar)(sha256_ctx->H[i / 4] >> 24);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2307 sha256_ctx->H[i / 4] <<= 8;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2308 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2309
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2310 purple_cipher_context_reset(context, NULL);
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2311
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2312 if(out_len)
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2313 *out_len = 32;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2314
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2315 return TRUE;
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2316 }
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2317
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2318 static PurpleCipherOps SHA256Ops = {
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2319 sha256_set_opt, /* Set Option */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2320 sha256_get_opt, /* Get Option */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2321 sha256_init, /* init */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2322 sha256_reset, /* reset */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2323 sha256_uninit, /* uninit */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2324 NULL, /* set iv */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2325 sha256_append, /* append */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2326 sha256_digest, /* digest */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2327 NULL, /* encrypt */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2328 NULL, /* decrypt */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2329 NULL, /* set salt */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2330 NULL, /* get salt size */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2331 NULL, /* set key */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2332 NULL, /* get key size */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2333 NULL, /* set batch mode */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2334 NULL, /* get batch mode */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2335 sha256_get_block_size, /* get block size */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2336 NULL /* set key with len */
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2337 };
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2338
27539
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2339 #endif /* GLIB_CHECK_VERSION(2,16,0) */
e94b84b12eb6 Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents: 27497
diff changeset
2340
27383
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2341 /*******************************************************************************
17053
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2342 * RC4
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2343 ******************************************************************************/
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2344
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2345 struct RC4Context {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2346 guchar state[256];
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2347 guchar x;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2348 guchar y;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2349 gint key_len;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2350 };
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2351
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2352 static void
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2353 rc4_init(PurpleCipherContext *context, void *extra) {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2354 struct RC4Context *rc4_ctx;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2355 rc4_ctx = g_new0(struct RC4Context, 1);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2356 purple_cipher_context_set_data(context, rc4_ctx);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2357 purple_cipher_context_reset(context, extra);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2358 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2359
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2360
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2361 static void
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2362 rc4_reset(PurpleCipherContext *context, void *extra) {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2363 struct RC4Context *rc4_ctx;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2364 guint i;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2365
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2366 rc4_ctx = purple_cipher_context_get_data(context);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2367
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2368 g_return_if_fail(rc4_ctx);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2369
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2370 for(i = 0; i < 256; i++)
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2371 rc4_ctx->state[i] = i;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2372 rc4_ctx->x = 0;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2373 rc4_ctx->y = 0;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2374
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2375 /* default is 5 bytes (40bit key) */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2376 rc4_ctx->key_len = 5;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2377
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2378 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2379
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2380 static void
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2381 rc4_uninit(PurpleCipherContext *context) {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2382 struct RC4Context *rc4_ctx;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2383
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2384 rc4_ctx = purple_cipher_context_get_data(context);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2385 memset(rc4_ctx, 0, sizeof(rc4_ctx));
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2386
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2387 g_free(rc4_ctx);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2388 rc4_ctx = NULL;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2389 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2390
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2391
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2392
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2393 static void
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2394 rc4_set_key (PurpleCipherContext *context, const guchar * key) {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2395 struct RC4Context *ctx;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2396 guchar *state;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2397 guchar temp_swap;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2398 guchar x, y;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2399 guint i;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2400
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2401 ctx = purple_cipher_context_get_data(context);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2402
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2403 x = 0;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2404 y = 0;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2405 state = &ctx->state[0];
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2406 for(i = 0; i < 256; i++)
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2407 {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2408 y = (key[x] + state[i] + y) % 256;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2409 temp_swap = state[i];
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2410 state[i] = state[y];
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2411 state[y] = temp_swap;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2412 x = (x + 1) % ctx->key_len;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2413 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2414 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2415
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2416 static void
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2417 rc4_set_opt(PurpleCipherContext *context, const gchar *name, void *value) {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2418 struct RC4Context *ctx;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2419
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2420 ctx = purple_cipher_context_get_data(context);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2421
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 23867
diff changeset
2422 if(purple_strequal(name, "key_len")) {
17053
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2423 ctx->key_len = GPOINTER_TO_INT(value);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2424 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2425 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2426
25888
d0fdd378a635 Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents: 25859
diff changeset
2427 static size_t
17053
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2428 rc4_get_key_size (PurpleCipherContext *context)
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2429 {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2430 struct RC4Context *ctx;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2431
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2432 g_return_val_if_fail(context, -1);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2433
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2434 ctx = purple_cipher_context_get_data(context);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2435
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2436 g_return_val_if_fail(ctx, -1);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2437
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2438 return ctx->key_len;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2439 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2440
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2441 static void *
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2442 rc4_get_opt(PurpleCipherContext *context, const gchar *name) {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2443 struct RC4Context *ctx;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2444
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2445 ctx = purple_cipher_context_get_data(context);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2446
25859
b42be7bb9dac Patch from Paul Aurich to add purple_strequal to help readability and simplicity of code. Ie, don't need to negate the value of strcmp, since this does a strcmp and does the negation for us
Paul Aurich <darkrain42@pidgin.im>
parents: 23867
diff changeset
2447 if(purple_strequal(name, "key_len")) {
17053
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2448 return GINT_TO_POINTER(ctx->key_len);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2449 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2450
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2451 return NULL;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2452 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2453
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2454 static gint
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2455 rc4_encrypt(PurpleCipherContext *context, const guchar data[],
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2456 size_t len, guchar output[], size_t *outlen) {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2457 struct RC4Context *ctx;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2458 guchar temp_swap;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2459 guchar x, y, z;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2460 guchar *state;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2461 guint i;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2462
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2463 ctx = purple_cipher_context_get_data(context);
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2464
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2465 x = ctx->x;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2466 y = ctx->y;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2467 state = &ctx->state[0];
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2468
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2469 for(i = 0; i < len; i++)
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2470 {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2471 x = (x + 1) % 256;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2472 y = (state[x] + y) % 256;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2473 temp_swap = state[x];
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2474 state[x] = state[y];
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2475 state[y] = temp_swap;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2476 z = state[x] + (state[y]) % 256;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2477 output[i] = data[i] ^ state[z];
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2478 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2479 ctx->x = x;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2480 ctx->y = y;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2481 if(outlen)
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2482 *outlen = len;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2483
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2484 return 0;
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2485 }
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2486
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2487 static PurpleCipherOps RC4Ops = {
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2488 rc4_set_opt, /* Set Option */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2489 rc4_get_opt, /* Get Option */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2490 rc4_init, /* init */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2491 rc4_reset, /* reset */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2492 rc4_uninit, /* uninit */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2493 NULL, /* set iv */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2494 NULL, /* append */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2495 NULL, /* digest */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2496 rc4_encrypt, /* encrypt */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2497 NULL, /* decrypt */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2498 NULL, /* set salt */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2499 NULL, /* get salt size */
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2500 rc4_set_key, /* set key */
17065
a6982e7ab5a9 Add padding to the RC4Ops struct to fix a compiler warning.
Richard Laager <rlaager@pidgin.im>
parents: 17053
diff changeset
2501 rc4_get_key_size, /* get key size */
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
2502 NULL, /* set batch mode */
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
2503 NULL, /* get batch mode */
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
2504 NULL, /* get block size */
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
2505 NULL /* set key with len */
17053
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2506 };
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2507
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2508 /*******************************************************************************
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2509 * Structs
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2510 ******************************************************************************/
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2511 struct _PurpleCipher {
17435
a42f7e095cfd - Add documentation for the internal CipherContext struct
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17155
diff changeset
2512 gchar *name; /**< Internal name - used for searching */
a42f7e095cfd - Add documentation for the internal CipherContext struct
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17155
diff changeset
2513 PurpleCipherOps *ops; /**< Operations supported by this cipher */
a42f7e095cfd - Add documentation for the internal CipherContext struct
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17155
diff changeset
2514 guint ref; /**< Reference count */
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2515 };
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2516
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2517 struct _PurpleCipherContext {
17435
a42f7e095cfd - Add documentation for the internal CipherContext struct
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17155
diff changeset
2518 PurpleCipher *cipher; /**< Cipher this context is under */
a42f7e095cfd - Add documentation for the internal CipherContext struct
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17155
diff changeset
2519 gpointer data; /**< Internal cipher state data */
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2520 };
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2521
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2522 /******************************************************************************
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2523 * Globals
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2524 *****************************************************************************/
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2525 static GList *ciphers = NULL;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2526
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2527 /******************************************************************************
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2528 * PurpleCipher API
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2529 *****************************************************************************/
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2530 const gchar *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2531 purple_cipher_get_name(PurpleCipher *cipher) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2532 g_return_val_if_fail(cipher, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2533
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2534 return cipher->name;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2535 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2536
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2537 guint
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2538 purple_cipher_get_capabilities(PurpleCipher *cipher) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2539 PurpleCipherOps *ops = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2540 guint caps = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2541
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2542 g_return_val_if_fail(cipher, 0);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2543
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2544 ops = cipher->ops;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2545 g_return_val_if_fail(ops, 0);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2546
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2547 if(ops->set_option)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2548 caps |= PURPLE_CIPHER_CAPS_SET_OPT;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2549 if(ops->get_option)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2550 caps |= PURPLE_CIPHER_CAPS_GET_OPT;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2551 if(ops->init)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2552 caps |= PURPLE_CIPHER_CAPS_INIT;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2553 if(ops->reset)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2554 caps |= PURPLE_CIPHER_CAPS_RESET;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2555 if(ops->uninit)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2556 caps |= PURPLE_CIPHER_CAPS_UNINIT;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2557 if(ops->set_iv)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2558 caps |= PURPLE_CIPHER_CAPS_SET_IV;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2559 if(ops->append)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2560 caps |= PURPLE_CIPHER_CAPS_APPEND;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2561 if(ops->digest)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2562 caps |= PURPLE_CIPHER_CAPS_DIGEST;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2563 if(ops->encrypt)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2564 caps |= PURPLE_CIPHER_CAPS_ENCRYPT;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2565 if(ops->decrypt)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2566 caps |= PURPLE_CIPHER_CAPS_DECRYPT;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2567 if(ops->set_salt)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2568 caps |= PURPLE_CIPHER_CAPS_SET_SALT;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2569 if(ops->get_salt_size)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2570 caps |= PURPLE_CIPHER_CAPS_GET_SALT_SIZE;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2571 if(ops->set_key)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2572 caps |= PURPLE_CIPHER_CAPS_SET_KEY;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2573 if(ops->get_key_size)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2574 caps |= PURPLE_CIPHER_CAPS_GET_KEY_SIZE;
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
2575 if(ops->set_batch_mode)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
2576 caps |= PURPLE_CIPHER_CAPS_SET_BATCH_MODE;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
2577 if(ops->get_batch_mode)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
2578 caps |= PURPLE_CIPHER_CAPS_GET_BATCH_MODE;
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
2579 if(ops->get_block_size)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
2580 caps |= PURPLE_CIPHER_CAPS_GET_BLOCK_SIZE;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
2581 if(ops->set_key_with_len)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
2582 caps |= PURPLE_CIPHER_CAPS_SET_KEY_WITH_LEN;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2583
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2584 return caps;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2585 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2586
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2587 gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2588 purple_cipher_digest_region(const gchar *name, const guchar *data,
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2589 size_t data_len, size_t in_len,
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
2590 guchar digest[], size_t *out_len)
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2591 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2592 PurpleCipher *cipher;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2593 PurpleCipherContext *context;
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2594 gboolean ret = FALSE;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2595
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2596 g_return_val_if_fail(name, FALSE);
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2597 g_return_val_if_fail(data, FALSE);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2598
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2599 cipher = purple_ciphers_find_cipher(name);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2600
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2601 g_return_val_if_fail(cipher, FALSE);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2602
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2603 if(!cipher->ops->append || !cipher->ops->digest) {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
2604 purple_debug_warning("cipher", "purple_cipher_region failed: "
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2605 "the %s cipher does not support appending and or "
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2606 "digesting.", cipher->name);
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2607 return FALSE;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2608 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2609
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2610 context = purple_cipher_context_new(cipher, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2611 purple_cipher_context_append(context, data, data_len);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2612 ret = purple_cipher_context_digest(context, in_len, digest, out_len);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2613 purple_cipher_context_destroy(context);
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2614
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2615 return ret;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2616 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2617
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2618 /******************************************************************************
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2619 * PurpleCiphers API
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2620 *****************************************************************************/
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2621 PurpleCipher *
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2622 purple_ciphers_find_cipher(const gchar *name) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2623 PurpleCipher *cipher;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2624 GList *l;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2625
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2626 g_return_val_if_fail(name, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2627
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2628 for(l = ciphers; l; l = l->next) {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2629 cipher = PURPLE_CIPHER(l->data);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2630
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2631 if(!g_ascii_strcasecmp(cipher->name, name))
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2632 return cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2633 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2634
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2635 return NULL;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2636 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2637
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2638 PurpleCipher *
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2639 purple_ciphers_register_cipher(const gchar *name, PurpleCipherOps *ops) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2640 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2641
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2642 g_return_val_if_fail(name, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2643 g_return_val_if_fail(ops, NULL);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2644 g_return_val_if_fail(!purple_ciphers_find_cipher(name), NULL);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2645
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2646 cipher = g_new0(PurpleCipher, 1);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2647 PURPLE_DBUS_REGISTER_POINTER(cipher, PurpleCipher);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2648
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2649 cipher->name = g_strdup(name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2650 cipher->ops = ops;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2651
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2652 ciphers = g_list_append(ciphers, cipher);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2653
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2654 purple_signal_emit(purple_ciphers_get_handle(), "cipher-added", cipher);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2655
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2656 return cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2657 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2658
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2659 gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2660 purple_ciphers_unregister_cipher(PurpleCipher *cipher) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2661 g_return_val_if_fail(cipher, FALSE);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2662 g_return_val_if_fail(cipher->ref == 0, FALSE);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2663
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2664 purple_signal_emit(purple_ciphers_get_handle(), "cipher-removed", cipher);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2665
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2666 ciphers = g_list_remove(ciphers, cipher);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2667
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2668 g_free(cipher->name);
13760
09669e542e2f [gaim-migrate @ 16169]
Mark Doliner <markdoliner@pidgin.im>
parents: 13699
diff changeset
2669
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2670 PURPLE_DBUS_UNREGISTER_POINTER(cipher);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2671 g_free(cipher);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2672
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2673 return TRUE;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2674 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2675
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2676 GList *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2677 purple_ciphers_get_ciphers() {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2678 return ciphers;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2679 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2680
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2681 /******************************************************************************
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2682 * PurpleCipher Subsystem API
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2683 *****************************************************************************/
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2684 gpointer
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2685 purple_ciphers_get_handle() {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2686 static gint handle;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2687
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2688 return &handle;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2689 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2690
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2691 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2692 purple_ciphers_init() {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2693 gpointer handle;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2694
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2695 handle = purple_ciphers_get_handle();
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2696
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2697 purple_signal_register(handle, "cipher-added",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2698 purple_marshal_VOID__POINTER, NULL, 1,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2699 purple_value_new(PURPLE_TYPE_SUBTYPE,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2700 PURPLE_SUBTYPE_CIPHER));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2701 purple_signal_register(handle, "cipher-removed",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2702 purple_marshal_VOID__POINTER, NULL, 1,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2703 purple_value_new(PURPLE_TYPE_SUBTYPE,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2704 PURPLE_SUBTYPE_CIPHER));
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2705
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2706 purple_ciphers_register_cipher("md5", &MD5Ops);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2707 purple_ciphers_register_cipher("sha1", &SHA1Ops);
27383
cbb399c19d87 An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents: 25888
diff changeset
2708 purple_ciphers_register_cipher("sha256", &SHA256Ops);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2709 purple_ciphers_register_cipher("md4", &MD4Ops);
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
2710 purple_ciphers_register_cipher("hmac", &HMACOps);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2711 purple_ciphers_register_cipher("des", &DESOps);
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
2712 purple_ciphers_register_cipher("des3", &DES3Ops);
17053
564ffcd0fe40 RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents: 16747
diff changeset
2713 purple_ciphers_register_cipher("rc4", &RC4Ops);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2714 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2715
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2716 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2717 purple_ciphers_uninit() {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2718 PurpleCipher *cipher;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2719 GList *l, *ll;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2720
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2721 for(l = ciphers; l; l = ll) {
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2722 ll = l->next;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2723
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2724 cipher = PURPLE_CIPHER(l->data);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2725 purple_ciphers_unregister_cipher(cipher);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2726 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2727
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2728 g_list_free(ciphers);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2729
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2730 purple_signals_unregister_by_instance(purple_ciphers_get_handle());
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2731 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2732 /******************************************************************************
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2733 * PurpleCipherContext API
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2734 *****************************************************************************/
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2735 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2736 purple_cipher_context_set_option(PurpleCipherContext *context, const gchar *name,
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2737 gpointer value)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2738 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2739 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2740
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2741 g_return_if_fail(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2742 g_return_if_fail(name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2743
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2744 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2745 g_return_if_fail(cipher);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2746
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2747 if(cipher->ops && cipher->ops->set_option)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2748 cipher->ops->set_option(context, name, value);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2749 else
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
2750 purple_debug_warning("cipher", "the %s cipher does not support the "
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2751 "set_option operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2752 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2753
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2754 gpointer
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2755 purple_cipher_context_get_option(PurpleCipherContext *context, const gchar *name) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2756 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2757
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2758 g_return_val_if_fail(context, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2759 g_return_val_if_fail(name, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2760
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2761 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2762 g_return_val_if_fail(cipher, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2763
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2764 if(cipher->ops && cipher->ops->get_option)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2765 return cipher->ops->get_option(context, name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2766 else {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
2767 purple_debug_warning("cipher", "the %s cipher does not support the "
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2768 "get_option operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2769
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2770 return NULL;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2771 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2772 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2773
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2774 PurpleCipherContext *
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2775 purple_cipher_context_new(PurpleCipher *cipher, void *extra) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2776 PurpleCipherContext *context = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2777
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2778 g_return_val_if_fail(cipher, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2779
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2780 cipher->ref++;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2781
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2782 context = g_new0(PurpleCipherContext, 1);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2783 context->cipher = cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2784
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2785 if(cipher->ops->init)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2786 cipher->ops->init(context, extra);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2787
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2788 return context;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2789 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2790
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2791 PurpleCipherContext *
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2792 purple_cipher_context_new_by_name(const gchar *name, void *extra) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2793 PurpleCipher *cipher;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2794
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2795 g_return_val_if_fail(name, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2796
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2797 cipher = purple_ciphers_find_cipher(name);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2798
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2799 g_return_val_if_fail(cipher, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2800
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2801 return purple_cipher_context_new(cipher, extra);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2802 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2803
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2804 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2805 purple_cipher_context_reset(PurpleCipherContext *context, void *extra) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2806 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2807
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2808 g_return_if_fail(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2809
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2810 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2811 g_return_if_fail(cipher);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2812
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2813 if(cipher->ops && cipher->ops->reset)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2814 context->cipher->ops->reset(context, extra);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2815 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2816
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2817 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2818 purple_cipher_context_destroy(PurpleCipherContext *context) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2819 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2820
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2821 g_return_if_fail(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2822
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2823 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2824 g_return_if_fail(cipher);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2825
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2826 cipher->ref--;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2827
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2828 if(cipher->ops && cipher->ops->uninit)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2829 cipher->ops->uninit(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2830
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2831 memset(context, 0, sizeof(context));
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2832 g_free(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2833 context = NULL;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2834 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2835
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2836 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2837 purple_cipher_context_set_iv(PurpleCipherContext *context, guchar *iv, size_t len)
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2838 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2839 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2840
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2841 g_return_if_fail(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2842 g_return_if_fail(iv);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2843
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2844 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2845 g_return_if_fail(cipher);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2846
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2847 if(cipher->ops && cipher->ops->set_iv)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2848 cipher->ops->set_iv(context, iv, len);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2849 else
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
2850 purple_debug_warning("cipher", "the %s cipher does not support the set"
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2851 "initialization vector operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2852 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2853
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2854 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2855 purple_cipher_context_append(PurpleCipherContext *context, const guchar *data,
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2856 size_t len)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2857 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2858 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2859
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2860 g_return_if_fail(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2861
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2862 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2863 g_return_if_fail(cipher);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2864
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2865 if(cipher->ops && cipher->ops->append)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2866 cipher->ops->append(context, data, len);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2867 else
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
2868 purple_debug_warning("cipher", "the %s cipher does not support the append "
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2869 "operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2870 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2871
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2872 gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2873 purple_cipher_context_digest(PurpleCipherContext *context, size_t in_len,
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
2874 guchar digest[], size_t *out_len)
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2875 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2876 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2877
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2878 g_return_val_if_fail(context, FALSE);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2879
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2880 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2881
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2882 if(cipher->ops && cipher->ops->digest)
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2883 return cipher->ops->digest(context, in_len, digest, out_len);
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2884 else {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
2885 purple_debug_warning("cipher", "the %s cipher does not support the digest "
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2886 "operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2887 return FALSE;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2888 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2889 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2890
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2891 gboolean
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2892 purple_cipher_context_digest_to_str(PurpleCipherContext *context, size_t in_len,
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2893 gchar digest_s[], size_t *out_len)
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2894 {
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2895 /* 8k is a bit excessive, will tweak later. */
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
2896 guchar digest[BUF_LEN * 4];
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2897 gint n = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2898 size_t dlen = 0;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2899
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2900 g_return_val_if_fail(context, FALSE);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2901 g_return_val_if_fail(digest_s, FALSE);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2902
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2903 if(!purple_cipher_context_digest(context, sizeof(digest), digest, &dlen))
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2904 return FALSE;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2905
12388
3a25d96abdaf [gaim-migrate @ 14694]
Richard Laager <rlaager@pidgin.im>
parents: 12382
diff changeset
2906 /* in_len must be greater than dlen * 2 so we have room for the NUL. */
3a25d96abdaf [gaim-migrate @ 14694]
Richard Laager <rlaager@pidgin.im>
parents: 12382
diff changeset
2907 if(in_len <= dlen * 2)
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2908 return FALSE;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2909
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2910 for(n = 0; n < dlen; n++)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2911 sprintf(digest_s + (n * 2), "%02x", digest[n]);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2912
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2913 digest_s[n * 2] = '\0';
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2914
10687
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2915 if(out_len)
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2916 *out_len = dlen * 2;
5ac4b470bee8 [gaim-migrate @ 12235]
Etan Reisner <deryni@pidgin.im>
parents: 10684
diff changeset
2917
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2918 return TRUE;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2919 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2920
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2921 gint
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2922 purple_cipher_context_encrypt(PurpleCipherContext *context, const guchar data[],
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
2923 size_t len, guchar output[], size_t *outlen)
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2924 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2925 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2926
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2927 g_return_val_if_fail(context, -1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2928
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2929 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2930 g_return_val_if_fail(cipher, -1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2931
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2932 if(cipher->ops && cipher->ops->encrypt)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2933 return cipher->ops->encrypt(context, data, len, output, outlen);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2934 else {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
2935 purple_debug_warning("cipher", "the %s cipher does not support the encrypt"
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2936 "operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2937
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2938 if(outlen)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2939 *outlen = -1;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2940
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2941 return -1;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2942 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2943 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2944
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2945 gint
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2946 purple_cipher_context_decrypt(PurpleCipherContext *context, const guchar data[],
11183
be87fe695c93 [gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents: 11143
diff changeset
2947 size_t len, guchar output[], size_t *outlen)
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2948 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2949 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2950
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2951 g_return_val_if_fail(context, -1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2952
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2953 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2954 g_return_val_if_fail(cipher, -1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2955
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2956 if(cipher->ops && cipher->ops->decrypt)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2957 return cipher->ops->decrypt(context, data, len, output, outlen);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2958 else {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
2959 purple_debug_warning("cipher", "the %s cipher does not support the decrypt"
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2960 "operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2961
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2962 if(outlen)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2963 *outlen = -1;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2964
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2965 return -1;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2966 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2967 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2968
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2969 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2970 purple_cipher_context_set_salt(PurpleCipherContext *context, guchar *salt) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2971 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2972
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2973 g_return_if_fail(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2974
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2975 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2976 g_return_if_fail(cipher);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2977
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2978 if(cipher->ops && cipher->ops->set_salt)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2979 cipher->ops->set_salt(context, salt);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2980 else
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
2981 purple_debug_warning("cipher", "the %s cipher does not support the "
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2982 "set_salt operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2983 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2984
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2985 size_t
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2986 purple_cipher_context_get_salt_size(PurpleCipherContext *context) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2987 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2988
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2989 g_return_val_if_fail(context, -1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2990
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2991 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2992 g_return_val_if_fail(cipher, -1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2993
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2994 if(cipher->ops && cipher->ops->get_salt_size)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2995 return cipher->ops->get_salt_size(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2996 else {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
2997 purple_debug_warning("cipher", "the %s cipher does not support the "
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2998 "get_salt_size operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
2999
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3000 return -1;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3001 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3002 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3003
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3004 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3005 purple_cipher_context_set_key(PurpleCipherContext *context, const guchar *key) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3006 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3007
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3008 g_return_if_fail(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3009
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3010 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3011 g_return_if_fail(cipher);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3012
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3013 if(cipher->ops && cipher->ops->set_key)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3014 cipher->ops->set_key(context, key);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3015 else
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
3016 purple_debug_warning("cipher", "the %s cipher does not support the "
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3017 "set_key operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3018 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3019
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3020 size_t
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3021 purple_cipher_context_get_key_size(PurpleCipherContext *context) {
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3022 PurpleCipher *cipher = NULL;
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3023
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3024 g_return_val_if_fail(context, -1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3025
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3026 cipher = context->cipher;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3027 g_return_val_if_fail(cipher, -1);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3028
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3029 if(cipher->ops && cipher->ops->get_key_size)
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3030 return cipher->ops->get_key_size(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3031 else {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
3032 purple_debug_warning("cipher", "the %s cipher does not support the "
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3033 "get_key_size operation\n", cipher->name);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3034
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3035 return -1;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3036 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3037 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3038
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3039 void
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3040 purple_cipher_context_set_batch_mode(PurpleCipherContext *context,
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3041 PurpleCipherBatchMode mode)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3042 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3043 PurpleCipher *cipher = NULL;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3044
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3045 g_return_if_fail(context);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3046
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3047 cipher = context->cipher;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3048 g_return_if_fail(cipher);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3049
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3050 if(cipher->ops && cipher->ops->set_batch_mode)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3051 cipher->ops->set_batch_mode(context, mode);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3052 else
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
3053 purple_debug_warning("cipher", "The %s cipher does not support the "
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3054 "set_batch_mode operation\n", cipher->name);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3055 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3056
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3057 PurpleCipherBatchMode
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3058 purple_cipher_context_get_batch_mode(PurpleCipherContext *context)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3059 {
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3060 PurpleCipher *cipher = NULL;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3061
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3062 g_return_val_if_fail(context, -1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3063
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3064 cipher = context->cipher;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3065 g_return_val_if_fail(cipher, -1);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3066
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3067 if(cipher->ops && cipher->ops->get_batch_mode)
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3068 return cipher->ops->get_batch_mode(context);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3069 else {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
3070 purple_debug_warning("cipher", "The %s cipher does not support the "
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3071 "get_batch_mode operation\n", cipher->name);
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3072 return -1;
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3073 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3074 }
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3075
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3076 size_t
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3077 purple_cipher_context_get_block_size(PurpleCipherContext *context)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3078 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3079 PurpleCipher *cipher = NULL;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3080
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3081 g_return_val_if_fail(context, -1);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3082
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3083 cipher = context->cipher;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3084 g_return_val_if_fail(cipher, -1);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3085
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3086 if(cipher->ops && cipher->ops->get_block_size)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3087 return cipher->ops->get_block_size(context);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3088 else {
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
3089 purple_debug_warning("cipher", "The %s cipher does not support the "
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3090 "get_block_size operation\n", cipher->name);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3091 return -1;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3092 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3093 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3094
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3095 void
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3096 purple_cipher_context_set_key_with_len(PurpleCipherContext *context,
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3097 const guchar *key, size_t len)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3098 {
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3099 PurpleCipher *cipher = NULL;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3100
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3101 g_return_if_fail(context);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3102
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3103 cipher = context->cipher;
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3104 g_return_if_fail(cipher);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3105
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3106 if(cipher->ops && cipher->ops->set_key_with_len)
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3107 cipher->ops->set_key_with_len(context, key, len);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3108 else
27497
2dc5a0e0c4c2 Increase the logging level of some debugging messages that seemed to be a
Mauro Brasil <mauro.brasil@tqi.com.br>
parents: 27383
diff changeset
3109 purple_debug_warning("cipher", "The %s cipher does not support the "
22025
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3110 "set_key_with_len operation\n", cipher->name);
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3111 }
23756775175d HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 22024
diff changeset
3112
22024
3fd5e4fff1be Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 21091
diff changeset
3113 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3114 purple_cipher_context_set_data(PurpleCipherContext *context, gpointer data) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3115 g_return_if_fail(context);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3116
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3117 context->data = data;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3118 }
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3119
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3120 gpointer
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3121 purple_cipher_context_get_data(PurpleCipherContext *context) {
10684
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3122 g_return_val_if_fail(context, NULL);
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3123
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3124 return context->data;
0325b164a7eb [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
diff changeset
3125 }
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3126
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3127 gchar *purple_cipher_http_digest_calculate_session_key(
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3128 const gchar *algorithm,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3129 const gchar *username,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3130 const gchar *realm,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3131 const gchar *password,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3132 const gchar *nonce,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3133 const gchar *client_nonce)
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3134 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3135 PurpleCipher *cipher;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3136 PurpleCipherContext *context;
12388
3a25d96abdaf [gaim-migrate @ 14694]
Richard Laager <rlaager@pidgin.im>
parents: 12382
diff changeset
3137 gchar hash[33]; /* We only support MD5. */
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3138
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3139 g_return_val_if_fail(username != NULL, NULL);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3140 g_return_val_if_fail(realm != NULL, NULL);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3141 g_return_val_if_fail(password != NULL, NULL);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3142 g_return_val_if_fail(nonce != NULL, NULL);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3143
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3144 /* Check for a supported algorithm. */
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3145 g_return_val_if_fail(algorithm == NULL ||
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3146 *algorithm == '\0' ||
17155
143ff2796376 Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents: 17065
diff changeset
3147 g_ascii_strcasecmp(algorithm, "MD5") ||
143ff2796376 Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents: 17065
diff changeset
3148 g_ascii_strcasecmp(algorithm, "MD5-sess"), NULL);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3149
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3150 cipher = purple_ciphers_find_cipher("md5");
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3151 g_return_val_if_fail(cipher != NULL, NULL);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3152
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3153 context = purple_cipher_context_new(cipher, NULL);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3154
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3155 purple_cipher_context_append(context, (guchar *)username, strlen(username));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3156 purple_cipher_context_append(context, (guchar *)":", 1);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3157 purple_cipher_context_append(context, (guchar *)realm, strlen(realm));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3158 purple_cipher_context_append(context, (guchar *)":", 1);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3159 purple_cipher_context_append(context, (guchar *)password, strlen(password));
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3160
17155
143ff2796376 Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents: 17065
diff changeset
3161 if (algorithm != NULL && !g_ascii_strcasecmp(algorithm, "MD5-sess"))
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3162 {
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3163 guchar digest[16];
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3164
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3165 if (client_nonce == NULL)
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3166 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3167 purple_cipher_context_destroy(context);
19832
84b69b21672b Patch from QuLogic. Fixes #2903 ('Missing newlines in debug messages.')
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17435
diff changeset
3168 purple_debug_error("cipher", "Required client_nonce missing for MD5-sess digest calculation.\n");
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3169 return NULL;
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3170 }
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3171
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3172 purple_cipher_context_digest(context, sizeof(digest), digest, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3173 purple_cipher_context_destroy(context);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3174
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3175 context = purple_cipher_context_new(cipher, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3176 purple_cipher_context_append(context, digest, sizeof(digest));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3177 purple_cipher_context_append(context, (guchar *)":", 1);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3178 purple_cipher_context_append(context, (guchar *)nonce, strlen(nonce));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3179 purple_cipher_context_append(context, (guchar *)":", 1);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3180 purple_cipher_context_append(context, (guchar *)client_nonce, strlen(client_nonce));
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3181 }
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3182
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3183 purple_cipher_context_digest_to_str(context, sizeof(hash), hash, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3184 purple_cipher_context_destroy(context);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3185
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3186 return g_strdup(hash);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3187 }
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3188
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3189 gchar *purple_cipher_http_digest_calculate_response(
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3190 const gchar *algorithm,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3191 const gchar *method,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3192 const gchar *digest_uri,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3193 const gchar *qop,
12389
7196ba664097 [gaim-migrate @ 14695]
Richard Laager <rlaager@pidgin.im>
parents: 12388
diff changeset
3194 const gchar *entity,
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3195 const gchar *nonce,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3196 const gchar *nonce_count,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3197 const gchar *client_nonce,
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3198 const gchar *session_key)
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3199 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3200 PurpleCipher *cipher;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3201 PurpleCipherContext *context;
12388
3a25d96abdaf [gaim-migrate @ 14694]
Richard Laager <rlaager@pidgin.im>
parents: 12382
diff changeset
3202 static gchar hash2[33]; /* We only support MD5. */
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3203
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3204 g_return_val_if_fail(method != NULL, NULL);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3205 g_return_val_if_fail(digest_uri != NULL, NULL);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3206 g_return_val_if_fail(nonce != NULL, NULL);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3207 g_return_val_if_fail(session_key != NULL, NULL);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3208
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3209 /* Check for a supported algorithm. */
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3210 g_return_val_if_fail(algorithm == NULL ||
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3211 *algorithm == '\0' ||
17155
143ff2796376 Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents: 17065
diff changeset
3212 g_ascii_strcasecmp(algorithm, "MD5") ||
143ff2796376 Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents: 17065
diff changeset
3213 g_ascii_strcasecmp(algorithm, "MD5-sess"), NULL);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3214
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3215 /* Check for a supported "quality of protection". */
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3216 g_return_val_if_fail(qop == NULL ||
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3217 *qop == '\0' ||
17155
143ff2796376 Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents: 17065
diff changeset
3218 g_ascii_strcasecmp(qop, "auth") ||
143ff2796376 Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents: 17065
diff changeset
3219 g_ascii_strcasecmp(qop, "auth-int"), NULL);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3220
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3221 cipher = purple_ciphers_find_cipher("md5");
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3222 g_return_val_if_fail(cipher != NULL, NULL);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3223
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3224 context = purple_cipher_context_new(cipher, NULL);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3225
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3226 purple_cipher_context_append(context, (guchar *)method, strlen(method));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3227 purple_cipher_context_append(context, (guchar *)":", 1);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3228 purple_cipher_context_append(context, (guchar *)digest_uri, strlen(digest_uri));
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3229
17155
143ff2796376 Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents: 17065
diff changeset
3230 if (qop != NULL && !g_ascii_strcasecmp(qop, "auth-int"))
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3231 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3232 PurpleCipherContext *context2;
12389
7196ba664097 [gaim-migrate @ 14695]
Richard Laager <rlaager@pidgin.im>
parents: 12388
diff changeset
3233 gchar entity_hash[33];
7196ba664097 [gaim-migrate @ 14695]
Richard Laager <rlaager@pidgin.im>
parents: 12388
diff changeset
3234
7196ba664097 [gaim-migrate @ 14695]
Richard Laager <rlaager@pidgin.im>
parents: 12388
diff changeset
3235 if (entity == NULL)
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3236 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3237 purple_cipher_context_destroy(context);
19832
84b69b21672b Patch from QuLogic. Fixes #2903 ('Missing newlines in debug messages.')
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17435
diff changeset
3238 purple_debug_error("cipher", "Required entity missing for auth-int digest calculation.\n");
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3239 return NULL;
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3240 }
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3241
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3242 context2 = purple_cipher_context_new(cipher, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3243 purple_cipher_context_append(context2, (guchar *)entity, strlen(entity));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3244 purple_cipher_context_digest_to_str(context2, sizeof(entity_hash), entity_hash, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3245 purple_cipher_context_destroy(context2);
12389
7196ba664097 [gaim-migrate @ 14695]
Richard Laager <rlaager@pidgin.im>
parents: 12388
diff changeset
3246
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3247 purple_cipher_context_append(context, (guchar *)":", 1);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3248 purple_cipher_context_append(context, (guchar *)entity_hash, strlen(entity_hash));
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3249 }
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3250
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3251 purple_cipher_context_digest_to_str(context, sizeof(hash2), hash2, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3252 purple_cipher_context_destroy(context);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3253
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3254 context = purple_cipher_context_new(cipher, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3255 purple_cipher_context_append(context, (guchar *)session_key, strlen(session_key));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3256 purple_cipher_context_append(context, (guchar *)":", 1);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3257 purple_cipher_context_append(context, (guchar *)nonce, strlen(nonce));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3258 purple_cipher_context_append(context, (guchar *)":", 1);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3259
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3260 if (qop != NULL && *qop != '\0')
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3261 {
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3262 if (nonce_count == NULL)
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3263 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3264 purple_cipher_context_destroy(context);
19832
84b69b21672b Patch from QuLogic. Fixes #2903 ('Missing newlines in debug messages.')
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17435
diff changeset
3265 purple_debug_error("cipher", "Required nonce_count missing for digest calculation.\n");
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3266 return NULL;
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3267 }
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3268
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3269 if (client_nonce == NULL)
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3270 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3271 purple_cipher_context_destroy(context);
19832
84b69b21672b Patch from QuLogic. Fixes #2903 ('Missing newlines in debug messages.')
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 17435
diff changeset
3272 purple_debug_error("cipher", "Required client_nonce missing for digest calculation.\n");
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3273 return NULL;
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3274 }
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3275
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3276 purple_cipher_context_append(context, (guchar *)nonce_count, strlen(nonce_count));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3277 purple_cipher_context_append(context, (guchar *)":", 1);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3278 purple_cipher_context_append(context, (guchar *)client_nonce, strlen(client_nonce));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3279 purple_cipher_context_append(context, (guchar *)":", 1);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3280
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3281 purple_cipher_context_append(context, (guchar *)qop, strlen(qop));
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3282
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3283 purple_cipher_context_append(context, (guchar *)":", 1);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3284 }
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3285
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3286 purple_cipher_context_append(context, (guchar *)hash2, strlen(hash2));
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3287 purple_cipher_context_digest_to_str(context, sizeof(hash2), hash2, NULL);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
3288 purple_cipher_context_destroy(context);
12382
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3289
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3290 return g_strdup(hash2);
5ef67596b420 [gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents: 11677
diff changeset
3291 }

mercurial