Tue, 04 Aug 2009 04:03:41 +0000
merge of '5cc8bb002fd80dded75fbe9e34ae56a95033d295'
and 'afcf938f83caa730df0ff19a8bb92f14f88c9d0e'
| 10684 | 1 | /* |
| 15884 | 2 | * purple |
| 10684 | 3 | * |
| 15884 | 4 | * Purple is the legal property of its developers, whose names are too numerous |
| 10684 | 5 | * to list here. Please refer to the COPYRIGHT file distributed with this |
| 6 | * source distribution. | |
| 7 | * | |
| 8 | * Original md5 | |
| 9 | * Copyright (C) 2001-2003 Christophe Devine <c.devine@cr0.net> | |
| 10 | * | |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
11 | * Original md4 taken from linux kernel |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
12 | * MD4 Message Digest Algorithm (RFC1320). |
|
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 | 39 | * This program is free software; you can redistribute it and/or modify |
| 40 | * it under the terms of the GNU General Public License as published by | |
| 41 | * the Free Software Foundation; either version 2 of the License, or | |
| 42 | * (at your option) any later version. | |
| 43 | * | |
| 44 | * This program is distributed in the hope that it will be useful, | |
| 45 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 46 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 47 | * GNU General Public License for more details. | |
| 48 | * | |
| 49 | * You should have received a copy of the GNU General Public License | |
| 50 | * along with this program; if not, write to the Free Software | |
|
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 | 52 | */ |
| 53 | #include <glib.h> | |
| 54 | #include <string.h> | |
| 55 | #include <stdio.h> | |
| 56 | ||
| 57 | #include "internal.h" | |
| 58 | #include "cipher.h" | |
|
13760
09669e542e2f
[gaim-migrate @ 16169]
Mark Doliner <markdoliner@pidgin.im>
parents:
13699
diff
changeset
|
59 | #include "dbus-maybe.h" |
| 10684 | 60 | #include "debug.h" |
| 61 | #include "signals.h" | |
| 62 | #include "value.h" | |
| 63 | ||
|
27539
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
64 | #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
|
65 | 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
|
66 | 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
|
67 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
68 | 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
|
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 | 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
|
71 | 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
|
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 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
74 | 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
|
75 | 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
|
76 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
77 | 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
|
78 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
79 | 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
|
80 | 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
|
81 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
82 | #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
|
83 | 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
|
84 | #else |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
85 | 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
|
86 | 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
|
87 | 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
|
88 | #endif |
|
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 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
91 | 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
|
92 | 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
|
93 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
94 | 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
|
95 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
96 | 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
|
97 | 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
|
98 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
99 | 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
|
100 | } |
|
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 | 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
|
103 | 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
|
104 | 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
|
105 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
106 | 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
|
107 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
108 | 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
|
109 | 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
|
110 | |
|
27541
98dad20a0da7
Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents:
27539
diff
changeset
|
111 | while (len >= G_MAXSSIZE) { |
|
98dad20a0da7
Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents:
27539
diff
changeset
|
112 | g_checksum_update(checksum, data, G_MAXSSIZE); |
|
98dad20a0da7
Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents:
27539
diff
changeset
|
113 | len -= G_MAXSSIZE; |
|
98dad20a0da7
Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents:
27539
diff
changeset
|
114 | data += G_MAXSSIZE; |
|
98dad20a0da7
Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents:
27539
diff
changeset
|
115 | } |
|
98dad20a0da7
Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents:
27539
diff
changeset
|
116 | |
|
98dad20a0da7
Elliott's code looks nicer.
Paul Aurich <darkrain42@pidgin.im>
parents:
27539
diff
changeset
|
117 | 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
|
118 | 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
|
119 | } |
|
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 | 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
|
122 | 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
|
123 | 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
|
124 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
125 | 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
|
126 | 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
|
127 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
128 | 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
|
129 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
130 | 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
|
131 | 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
|
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 | 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
|
134 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
135 | 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
|
136 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
137 | 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
|
138 | *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
|
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 | 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
|
141 | } |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
142 | #endif |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
143 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
144 | |
| 10684 | 145 | /******************************************************************************* |
| 146 | * MD5 | |
| 147 | ******************************************************************************/ | |
|
22025
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
148 | #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
|
149 | |
|
27539
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
150 | 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
|
151 | 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
|
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 | /* 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
|
154 | 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
|
155 | } |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
156 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
157 | #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
|
158 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
159 | 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
|
160 | 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
|
161 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
162 | 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
|
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 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
165 | 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
|
166 | 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
|
167 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
168 | 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
|
169 | } |
|
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 | 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
|
172 | 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
|
173 | 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
|
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 | 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
|
176 | 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
|
177 | } |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
178 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
179 | 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
|
180 | 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
|
181 | 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
|
182 | 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
|
183 | 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
|
184 | 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
|
185 | 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
|
186 | 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
|
187 | 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
|
188 | 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
|
189 | 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
|
190 | 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
|
191 | 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
|
192 | 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
|
193 | 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
|
194 | 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
|
195 | 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
|
196 | 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
|
197 | 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
|
198 | }; |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
199 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
200 | #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
|
201 | |
| 10684 | 202 | struct MD5Context { |
| 203 | guint32 total[2]; | |
| 204 | guint32 state[4]; | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
205 | guchar buffer[64]; |
| 10684 | 206 | }; |
| 207 | ||
| 208 | #define MD5_GET_GUINT32(n,b,i) { \ | |
| 209 | (n) = ((guint32)(b) [(i) ] ) \ | |
| 210 | | ((guint32)(b) [(i) + 1] << 8) \ | |
| 211 | | ((guint32)(b) [(i) + 2] << 16) \ | |
| 212 | | ((guint32)(b) [(i) + 3] << 24); \ | |
| 213 | } | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
214 | #define MD5_PUT_GUINT32(n,b,i) { \ |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
215 | (b)[(i) ] = (guchar)((n) ); \ |
|
13219
5b0a1fd8bc84
[gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents:
12389
diff
changeset
|
216 | (b)[(i) + 1] = (guchar)((n) >> 8); \ |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
217 | (b)[(i) + 2] = (guchar)((n) >> 16); \ |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
218 | (b)[(i) + 3] = (guchar)((n) >> 24); \ |
| 10684 | 219 | } |
| 220 | ||
| 221 | static void | |
| 15884 | 222 | md5_init(PurpleCipherContext *context, gpointer extra) { |
| 10684 | 223 | struct MD5Context *md5_context; |
| 224 | ||
| 225 | md5_context = g_new0(struct MD5Context, 1); | |
| 226 | ||
| 15884 | 227 | purple_cipher_context_set_data(context, md5_context); |
| 10684 | 228 | |
| 15884 | 229 | purple_cipher_context_reset(context, extra); |
| 10684 | 230 | } |
| 231 | ||
| 232 | static void | |
| 15884 | 233 | md5_reset(PurpleCipherContext *context, gpointer extra) { |
| 10684 | 234 | struct MD5Context *md5_context; |
| 235 | ||
| 15884 | 236 | md5_context = purple_cipher_context_get_data(context); |
| 10684 | 237 | |
| 238 | md5_context->total[0] = 0; | |
| 239 | md5_context->total[1] = 0; | |
| 240 | ||
| 241 | md5_context->state[0] = 0x67452301; | |
| 242 | md5_context->state[1] = 0xEFCDAB89; | |
| 243 | md5_context->state[2] = 0x98BADCFE; | |
| 244 | md5_context->state[3] = 0x10325476; | |
| 245 | ||
| 246 | memset(md5_context->buffer, 0, sizeof(md5_context->buffer)); | |
| 247 | } | |
| 248 | ||
| 249 | static void | |
| 15884 | 250 | md5_uninit(PurpleCipherContext *context) { |
| 10684 | 251 | struct MD5Context *md5_context; |
| 252 | ||
| 15884 | 253 | purple_cipher_context_reset(context, NULL); |
| 10684 | 254 | |
| 15884 | 255 | md5_context = purple_cipher_context_get_data(context); |
| 10684 | 256 | memset(md5_context, 0, sizeof(md5_context)); |
| 257 | ||
| 258 | g_free(md5_context); | |
| 259 | md5_context = NULL; | |
| 260 | } | |
| 261 | ||
| 262 | static void | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
263 | md5_process(struct MD5Context *md5_context, const guchar data[64]) { |
| 10684 | 264 | guint32 X[16], A, B, C, D; |
| 265 | ||
| 266 | A = md5_context->state[0]; | |
| 267 | B = md5_context->state[1]; | |
| 268 | C = md5_context->state[2]; | |
| 269 | D = md5_context->state[3]; | |
| 270 | ||
| 271 | MD5_GET_GUINT32(X[ 0], data, 0); | |
| 272 | MD5_GET_GUINT32(X[ 1], data, 4); | |
| 273 | MD5_GET_GUINT32(X[ 2], data, 8); | |
| 274 | MD5_GET_GUINT32(X[ 3], data, 12); | |
| 275 | MD5_GET_GUINT32(X[ 4], data, 16); | |
| 276 | MD5_GET_GUINT32(X[ 5], data, 20); | |
| 277 | MD5_GET_GUINT32(X[ 6], data, 24); | |
| 278 | MD5_GET_GUINT32(X[ 7], data, 28); | |
| 279 | MD5_GET_GUINT32(X[ 8], data, 32); | |
| 280 | MD5_GET_GUINT32(X[ 9], data, 36); | |
| 281 | MD5_GET_GUINT32(X[10], data, 40); | |
| 282 | MD5_GET_GUINT32(X[11], data, 44); | |
| 283 | MD5_GET_GUINT32(X[12], data, 48); | |
| 284 | MD5_GET_GUINT32(X[13], data, 52); | |
| 285 | MD5_GET_GUINT32(X[14], data, 56); | |
| 286 | MD5_GET_GUINT32(X[15], data, 60); | |
| 287 | ||
| 288 | #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) | |
| 289 | #define P(a,b,c,d,k,s,t) { \ | |
| 290 | a += F(b,c,d) + X[k] + t; \ | |
| 291 | a = S(a,s) + b; \ | |
| 292 | } | |
| 293 | ||
| 294 | /* first pass */ | |
| 295 | #define F(x,y,z) (z ^ (x & (y ^ z))) | |
| 296 | P(A, B, C, D, 0, 7, 0xD76AA478); | |
| 297 | P(D, A, B, C, 1, 12, 0xE8C7B756); | |
| 298 | P(C, D, A, B, 2, 17, 0x242070DB); | |
| 299 | P(B, C, D, A, 3, 22, 0xC1BDCEEE); | |
| 300 | P(A, B, C, D, 4, 7, 0xF57C0FAF); | |
| 301 | P(D, A, B, C, 5, 12, 0x4787C62A); | |
| 302 | P(C, D, A, B, 6, 17, 0xA8304613); | |
| 303 | P(B, C, D, A, 7, 22, 0xFD469501); | |
| 304 | P(A, B, C, D, 8, 7, 0x698098D8); | |
| 305 | P(D, A, B, C, 9, 12, 0x8B44F7AF); | |
| 306 | P(C, D, A, B, 10, 17, 0xFFFF5BB1); | |
| 307 | P(B, C, D, A, 11, 22, 0x895CD7BE); | |
| 308 | P(A, B, C, D, 12, 7, 0x6B901122); | |
| 309 | P(D, A, B, C, 13, 12, 0xFD987193); | |
| 310 | P(C, D, A, B, 14, 17, 0xA679438E); | |
| 311 | P(B, C, D, A, 15, 22, 0x49B40821); | |
| 312 | #undef F | |
| 313 | ||
| 314 | /* second pass */ | |
| 315 | #define F(x,y,z) (y ^ (z & (x ^ y))) | |
| 316 | P(A, B, C, D, 1, 5, 0xF61E2562); | |
| 317 | P(D, A, B, C, 6, 9, 0xC040B340); | |
| 318 | P(C, D, A, B, 11, 14, 0x265E5A51); | |
| 319 | P(B, C, D, A, 0, 20, 0xE9B6C7AA); | |
| 320 | P(A, B, C, D, 5, 5, 0xD62F105D); | |
| 321 | P(D, A, B, C, 10, 9, 0x02441453); | |
| 322 | P(C, D, A, B, 15, 14, 0xD8A1E681); | |
| 323 | P(B, C, D, A, 4, 20, 0xE7D3FBC8); | |
| 324 | P(A, B, C, D, 9, 5, 0x21E1CDE6); | |
| 325 | P(D, A, B, C, 14, 9, 0xC33707D6); | |
| 326 | P(C, D, A, B, 3, 14, 0xF4D50D87); | |
| 327 | P(B, C, D, A, 8, 20, 0x455A14ED); | |
| 328 | P(A, B, C, D, 13, 5, 0xA9E3E905); | |
| 329 | P(D, A, B, C, 2, 9, 0xFCEFA3F8); | |
| 330 | P(C, D, A, B, 7, 14, 0x676F02D9); | |
| 331 | P(B, C, D, A, 12, 20, 0x8D2A4C8A); | |
| 332 | #undef F | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
333 | |
| 10684 | 334 | /* third pass */ |
| 335 | #define F(x,y,z) (x ^ y ^ z) | |
| 336 | P(A, B, C, D, 5, 4, 0xFFFA3942); | |
| 337 | P(D, A, B, C, 8, 11, 0x8771F681); | |
| 338 | P(C, D, A, B, 11, 16, 0x6D9D6122); | |
| 339 | P(B, C, D, A, 14, 23, 0xFDE5380C); | |
| 340 | P(A, B, C, D, 1, 4, 0xA4BEEA44); | |
| 341 | P(D, A, B, C, 4, 11, 0x4BDECFA9); | |
| 342 | P(C, D, A, B, 7, 16, 0xF6BB4B60); | |
| 343 | P(B, C, D, A, 10, 23, 0xBEBFBC70); | |
| 344 | P(A, B, C, D, 13, 4, 0x289B7EC6); | |
| 345 | P(D, A, B, C, 0, 11, 0xEAA127FA); | |
| 346 | P(C, D, A, B, 3, 16, 0xD4EF3085); | |
| 347 | P(B, C, D, A, 6, 23, 0x04881D05); | |
| 348 | P(A, B, C, D, 9, 4, 0xD9D4D039); | |
| 349 | P(D, A, B, C, 12, 11, 0xE6DB99E5); | |
| 350 | P(C, D, A, B, 15, 16, 0x1FA27CF8); | |
| 351 | P(B, C, D, A, 2, 23, 0xC4AC5665); | |
| 352 | #undef F | |
| 353 | ||
| 354 | /* forth pass */ | |
| 355 | #define F(x,y,z) (y ^ (x | ~z)) | |
| 356 | P(A, B, C, D, 0, 6, 0xF4292244); | |
| 357 | P(D, A, B, C, 7, 10, 0x432AFF97); | |
| 358 | P(C, D, A, B, 14, 15, 0xAB9423A7); | |
| 359 | P(B, C, D, A, 5, 21, 0xFC93A039); | |
| 360 | P(A, B, C, D, 12, 6, 0x655B59C3); | |
| 361 | P(D, A, B, C, 3, 10, 0x8F0CCC92); | |
| 362 | P(C, D, A, B, 10, 15, 0xFFEFF47D); | |
| 363 | P(B, C, D, A, 1, 21, 0x85845DD1); | |
| 364 | P(A, B, C, D, 8, 6, 0x6FA87E4F); | |
| 365 | P(D, A, B, C, 15, 10, 0xFE2CE6E0); | |
| 366 | P(C, D, A, B, 6, 15, 0xA3014314); | |
| 367 | P(B, C, D, A, 13, 21, 0x4E0811A1); | |
| 368 | P(A, B, C, D, 4, 6, 0xF7537E82); | |
| 369 | P(D, A, B, C, 11, 10, 0xBD3AF235); | |
| 370 | P(C, D, A, B, 2, 15, 0x2AD7D2BB); | |
| 371 | P(B, C, D, A, 9, 21, 0xEB86D391); | |
| 372 | #undef F | |
| 373 | #undef P | |
| 374 | #undef S | |
| 375 | ||
| 376 | md5_context->state[0] += A; | |
| 377 | md5_context->state[1] += B; | |
| 378 | md5_context->state[2] += C; | |
| 379 | md5_context->state[3] += D; | |
| 380 | } | |
| 381 | ||
| 382 | static void | |
| 15884 | 383 | md5_append(PurpleCipherContext *context, const guchar *data, size_t len) { |
| 10684 | 384 | struct MD5Context *md5_context = NULL; |
| 385 | guint32 left = 0, fill = 0; | |
| 386 | ||
| 387 | g_return_if_fail(context != NULL); | |
| 388 | ||
| 15884 | 389 | md5_context = purple_cipher_context_get_data(context); |
| 10684 | 390 | g_return_if_fail(md5_context != NULL); |
| 391 | ||
| 392 | left = md5_context->total[0] & 0x3F; | |
| 393 | fill = 64 - left; | |
| 394 | ||
| 395 | md5_context->total[0] += len; | |
| 396 | md5_context->total[0] &= 0xFFFFFFFF; | |
| 397 | ||
| 398 | if(md5_context->total[0] < len) | |
| 399 | md5_context->total[1]++; | |
| 400 | ||
| 401 | if(left && len >= fill) { | |
| 402 | memcpy((md5_context->buffer + left), data, fill); | |
| 403 | md5_process(md5_context, md5_context->buffer); | |
| 404 | len -= fill; | |
| 405 | data += fill; | |
| 406 | left = 0; | |
| 407 | } | |
| 408 | ||
| 409 | while(len >= 64) { | |
| 410 | md5_process(md5_context, data); | |
| 411 | len -= 64; | |
| 412 | data += 64; | |
| 413 | } | |
| 414 | ||
| 415 | if(len) { | |
| 416 | memcpy((md5_context->buffer + left), data, len); | |
| 417 | } | |
| 418 | } | |
| 419 | ||
| 420 | static gboolean | |
| 15884 | 421 | md5_digest(PurpleCipherContext *context, size_t in_len, guchar digest[16], |
| 10687 | 422 | size_t *out_len) |
| 423 | { | |
| 10684 | 424 | struct MD5Context *md5_context = NULL; |
| 425 | guint32 last, pad; | |
| 426 | guint32 high, low; | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
427 | guchar message[8]; |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
428 | guchar padding[64] = { |
| 10684 | 429 | 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 430 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 431 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 432 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | |
| 433 | }; | |
| 434 | ||
| 10687 | 435 | g_return_val_if_fail(in_len >= 16, FALSE); |
| 10684 | 436 | |
| 15884 | 437 | md5_context = purple_cipher_context_get_data(context); |
| 10684 | 438 | |
| 439 | high = (md5_context->total[0] >> 29) | |
| 440 | | (md5_context->total[1] << 3); | |
| 441 | low = (md5_context->total[0] << 3); | |
| 442 | ||
| 443 | MD5_PUT_GUINT32(low, message, 0); | |
| 444 | MD5_PUT_GUINT32(high, message, 4); | |
| 445 | ||
| 446 | last = md5_context->total[0] & 0x3F; | |
| 447 | pad = (last < 56) ? (56 - last) : (120 - last); | |
| 448 | ||
| 449 | md5_append(context, padding, pad); | |
| 450 | md5_append(context, message, 8); | |
| 451 | ||
| 452 | MD5_PUT_GUINT32(md5_context->state[0], digest, 0); | |
| 453 | MD5_PUT_GUINT32(md5_context->state[1], digest, 4); | |
| 454 | MD5_PUT_GUINT32(md5_context->state[2], digest, 8); | |
| 455 | MD5_PUT_GUINT32(md5_context->state[3], digest, 12); | |
| 456 | ||
| 10687 | 457 | if(out_len) |
| 458 | *out_len = 16; | |
| 459 | ||
| 10684 | 460 | return TRUE; |
| 461 | } | |
| 462 | ||
| 15884 | 463 | static PurpleCipherOps MD5Ops = { |
| 10684 | 464 | NULL, /* Set option */ |
| 465 | NULL, /* Get option */ | |
| 466 | md5_init, /* init */ | |
| 467 | md5_reset, /* reset */ | |
| 468 | md5_uninit, /* uninit */ | |
| 469 | NULL, /* set iv */ | |
| 470 | md5_append, /* append */ | |
| 471 | md5_digest, /* digest */ | |
| 472 | NULL, /* encrypt */ | |
| 473 | NULL, /* decrypt */ | |
| 474 | NULL, /* set salt */ | |
| 475 | NULL, /* get salt size */ | |
| 476 | NULL, /* set key */ | |
|
16747
fc3608e1e661
I _think_ this is it for libpurple's padding...
Gary Kramlich <grim@reaperworld.com>
parents:
15884
diff
changeset
|
477 | 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
|
478 | 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
|
479 | 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
|
480 | 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
|
481 | NULL /* set key with len */ |
| 10684 | 482 | }; |
| 483 | ||
|
27539
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
484 | #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
|
485 | |
| 10684 | 486 | /******************************************************************************* |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
487 | * MD4 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
488 | ******************************************************************************/ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
489 | #define MD4_DIGEST_SIZE 16 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
490 | #define MD4_HMAC_BLOCK_SIZE 64 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
491 | #define MD4_BLOCK_WORDS 16 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
492 | #define MD4_HASH_WORDS 4 |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
493 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
494 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
495 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
496 | struct MD4_Context { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
497 | guint32 hash[MD4_HASH_WORDS]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
498 | guint32 block[MD4_BLOCK_WORDS]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
499 | guint64 byte_count; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
500 | }; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
501 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
502 | static inline guint32 lshift(guint32 x, unsigned int s) |
|
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 | x &= 0xFFFFFFFF; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
505 | return ((x << s) & 0xFFFFFFFF) | (x >> (32 - s)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
506 | } |
|
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 | static inline guint32 F(guint32 x, guint32 y, guint32 z) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
509 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
510 | return (x & y) | ((~x) & z); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
511 | } |
|
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 | static inline guint32 G(guint32 x, guint32 y, guint32 z) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
514 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
515 | return (x & y) | (x & z) | (y & z); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
516 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
517 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
518 | static inline guint32 H(guint32 x, guint32 y, guint32 z) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
519 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
520 | return x ^ y ^ z; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
521 | } |
|
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 | #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
|
524 | #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
|
525 | #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
|
526 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
527 | 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
|
528 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
529 | while (words--) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
530 | *buf=GUINT_FROM_LE(*buf); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
531 | buf++; |
|
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 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
534 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
535 | 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
|
536 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
537 | while (words--) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
538 | *buf=GUINT_TO_LE(*buf); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
539 | buf++; |
|
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 | } |
|
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 | static void md4_transform(guint32 *hash, guint32 const *in) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
544 | { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
545 | guint32 a, b, c, d; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
546 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
547 | a = hash[0]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
548 | b = hash[1]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
549 | c = hash[2]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
550 | d = hash[3]; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
551 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
552 | ROUND1(a, b, c, d, in[0], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
553 | ROUND1(d, a, b, c, in[1], 7); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
554 | ROUND1(c, d, a, b, in[2], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
555 | ROUND1(b, c, d, a, in[3], 19); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
556 | ROUND1(a, b, c, d, in[4], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
557 | ROUND1(d, a, b, c, in[5], 7); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
558 | ROUND1(c, d, a, b, in[6], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
559 | ROUND1(b, c, d, a, in[7], 19); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
560 | ROUND1(a, b, c, d, in[8], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
561 | ROUND1(d, a, b, c, in[9], 7); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
562 | ROUND1(c, d, a, b, in[10], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
563 | ROUND1(b, c, d, a, in[11], 19); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
564 | ROUND1(a, b, c, d, in[12], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
565 | ROUND1(d, a, b, c, in[13], 7); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
566 | ROUND1(c, d, a, b, in[14], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
567 | ROUND1(b, c, d, a, in[15], 19); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
568 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
569 | ROUND2(a, b, c, d,in[ 0], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
570 | ROUND2(d, a, b, c, in[4], 5); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
571 | ROUND2(c, d, a, b, in[8], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
572 | ROUND2(b, c, d, a, in[12], 13); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
573 | ROUND2(a, b, c, d, in[1], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
574 | ROUND2(d, a, b, c, in[5], 5); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
575 | ROUND2(c, d, a, b, in[9], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
576 | ROUND2(b, c, d, a, in[13], 13); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
577 | ROUND2(a, b, c, d, in[2], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
578 | ROUND2(d, a, b, c, in[6], 5); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
579 | ROUND2(c, d, a, b, in[10], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
580 | ROUND2(b, c, d, a, in[14], 13); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
581 | ROUND2(a, b, c, d, in[3], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
582 | ROUND2(d, a, b, c, in[7], 5); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
583 | ROUND2(c, d, a, b, in[11], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
584 | ROUND2(b, c, d, a, in[15], 13); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
585 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
586 | ROUND3(a, b, c, d,in[ 0], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
587 | ROUND3(d, a, b, c, in[8], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
588 | ROUND3(c, d, a, b, in[4], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
589 | ROUND3(b, c, d, a, in[12], 15); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
590 | ROUND3(a, b, c, d, in[2], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
591 | ROUND3(d, a, b, c, in[10], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
592 | ROUND3(c, d, a, b, in[6], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
593 | ROUND3(b, c, d, a, in[14], 15); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
594 | ROUND3(a, b, c, d, in[1], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
595 | ROUND3(d, a, b, c, in[9], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
596 | ROUND3(c, d, a, b, in[5], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
597 | ROUND3(b, c, d, a, in[13], 15); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
598 | ROUND3(a, b, c, d, in[3], 3); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
599 | ROUND3(d, a, b, c, in[11], 9); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
600 | ROUND3(c, d, a, b, in[7], 11); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
601 | ROUND3(b, c, d, a, in[15], 15); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
602 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
603 | hash[0] += a; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
604 | hash[1] += b; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
605 | hash[2] += c; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
606 | hash[3] += d; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
607 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
608 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
609 | static inline void md4_transform_helper(struct MD4_Context *ctx) |
|
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 | 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
|
612 | md4_transform(ctx->hash, ctx->block); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
613 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
614 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
615 | static void |
| 15884 | 616 | md4_init(PurpleCipherContext *context, gpointer extra) { |
|
13219
5b0a1fd8bc84
[gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents:
12389
diff
changeset
|
617 | struct MD4_Context *mctx; |
|
5b0a1fd8bc84
[gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents:
12389
diff
changeset
|
618 | mctx = g_new0(struct MD4_Context, 1); |
| 15884 | 619 | purple_cipher_context_set_data(context, mctx); |
| 620 | purple_cipher_context_reset(context, extra); | |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
621 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
622 | mctx->hash[0] = 0x67452301; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
623 | mctx->hash[1] = 0xefcdab89; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
624 | mctx->hash[2] = 0x98badcfe; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
625 | mctx->hash[3] = 0x10325476; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
626 | mctx->byte_count = 0; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
627 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
628 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
629 | static void |
| 15884 | 630 | md4_reset(PurpleCipherContext *context, gpointer extra) { |
|
13219
5b0a1fd8bc84
[gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents:
12389
diff
changeset
|
631 | struct MD4_Context *mctx; |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
632 | |
| 15884 | 633 | mctx = purple_cipher_context_get_data(context); |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
634 | |
|
13219
5b0a1fd8bc84
[gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents:
12389
diff
changeset
|
635 | mctx->hash[0] = 0x67452301; |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
636 | mctx->hash[1] = 0xefcdab89; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
637 | mctx->hash[2] = 0x98badcfe; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
638 | mctx->hash[3] = 0x10325476; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
639 | mctx->byte_count = 0; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
640 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
641 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
642 | static void |
|
25888
d0fdd378a635
Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents:
25859
diff
changeset
|
643 | 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
|
644 | { |
| 15884 | 645 | 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
|
646 | const guint32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
647 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
648 | mctx->byte_count += len; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
649 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
650 | if (avail > len) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
651 | memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
652 | data, len); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
653 | return; |
|
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 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
656 | memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
657 | data, 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 | md4_transform_helper(mctx); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
660 | data += avail; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
661 | len -= avail; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
662 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
663 | while (len >= sizeof(mctx->block)) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
664 | memcpy(mctx->block, data, sizeof(mctx->block)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
665 | md4_transform_helper(mctx); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
666 | data += sizeof(mctx->block); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
667 | len -= sizeof(mctx->block); |
|
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 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
670 | memcpy(mctx->block, data, len); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
671 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
672 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
673 | static gboolean |
| 15884 | 674 | 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
|
675 | size_t *out_len) |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
676 | { |
| 15884 | 677 | 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
|
678 | const unsigned int offset = mctx->byte_count & 0x3f; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
679 | char *p = (char *)mctx->block + offset; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
680 | int padding = 56 - (offset + 1); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
681 | |
|
25888
d0fdd378a635
Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents:
25859
diff
changeset
|
682 | |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
683 | if(in_len<16) return FALSE; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
684 | if(out_len) *out_len = 16; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
685 | *p++ = 0x80; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
686 | if (padding < 0) { |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
687 | memset(p, 0x00, padding + sizeof (guint64)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
688 | md4_transform_helper(mctx); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
689 | p = (char *)mctx->block; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
690 | padding = 56; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
691 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
692 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
693 | memset(p, 0, padding); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
694 | mctx->block[14] = mctx->byte_count << 3; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
695 | mctx->block[15] = mctx->byte_count >> 29; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
696 | le32_to_cpu_array(mctx->block, (sizeof(mctx->block) - |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
697 | sizeof(guint64)) / sizeof(guint32)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
698 | md4_transform(mctx->hash, mctx->block); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
699 | 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
|
700 | memcpy(out, mctx->hash, sizeof(mctx->hash)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
701 | memset(mctx, 0, sizeof(*mctx)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
702 | return TRUE; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
703 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
704 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
705 | static void |
| 15884 | 706 | md4_uninit(PurpleCipherContext *context) { |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
707 | struct MD4_Context *md4_context; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
708 | |
| 15884 | 709 | purple_cipher_context_reset(context, NULL); |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
710 | |
| 15884 | 711 | md4_context = purple_cipher_context_get_data(context); |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
712 | memset(md4_context, 0, sizeof(md4_context)); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
713 | |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
714 | g_free(md4_context); |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
715 | md4_context = NULL; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
716 | } |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
717 | |
|
22025
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
718 | static size_t |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
719 | 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
|
720 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
721 | /* 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
|
722 | 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
|
723 | } |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
724 | |
| 15884 | 725 | static PurpleCipherOps MD4Ops = { |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
726 | NULL, /* Set option */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
727 | NULL, /* Get option */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
728 | md4_init, /* init */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
729 | md4_reset, /* reset */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
730 | md4_uninit, /* uninit */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
731 | NULL, /* set iv */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
732 | md4_append, /* append */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
733 | md4_digest, /* digest */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
734 | NULL, /* encrypt */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
735 | NULL, /* decrypt */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
736 | NULL, /* set salt */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
737 | NULL, /* get salt size */ |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
738 | NULL, /* set key */ |
|
16747
fc3608e1e661
I _think_ this is it for libpurple's padding...
Gary Kramlich <grim@reaperworld.com>
parents:
15884
diff
changeset
|
739 | 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
|
740 | 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
|
741 | 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
|
742 | 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
|
743 | 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
|
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 | /******************************************************************************* |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
747 | * HMAC |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
748 | ******************************************************************************/ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
749 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
750 | struct HMAC_Context { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
751 | PurpleCipherContext *hash; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
752 | char *name; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
753 | int blocksize; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
754 | guchar *opad; |
|
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 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
757 | static void |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
758 | 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
|
759 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
760 | struct HMAC_Context *hctx; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
761 | 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
|
762 | 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
|
763 | 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
|
764 | } |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
765 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
766 | static void |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
767 | 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
|
768 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
769 | struct HMAC_Context *hctx; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
770 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
771 | 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
|
772 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
773 | g_free(hctx->name); |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
774 | hctx->name = NULL; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
775 | if (hctx->hash) |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
776 | 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
|
777 | hctx->hash = NULL; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
778 | hctx->blocksize = 0; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
779 | g_free(hctx->opad); |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
780 | hctx->opad = NULL; |
|
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 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
783 | static void |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
784 | 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
|
785 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
786 | struct HMAC_Context *hctx; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
787 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
788 | 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
|
789 | |
|
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
|
790 | 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
|
791 | g_free(hctx->name); |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
792 | if (hctx->hash) |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
793 | 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
|
794 | 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
|
795 | 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
|
796 | 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
|
797 | } |
|
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 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
800 | static void * |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
801 | 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
|
802 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
803 | struct HMAC_Context *hctx; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
804 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
805 | 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
|
806 | |
|
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
|
807 | 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
|
808 | return hctx->name; |
|
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 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
811 | return NULL; |
|
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 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
814 | static void |
|
25888
d0fdd378a635
Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents:
25859
diff
changeset
|
815 | 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
|
816 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
817 | 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
|
818 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
819 | 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
|
820 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
821 | 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
|
822 | } |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
823 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
824 | static gboolean |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
825 | 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
|
826 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
827 | 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
|
828 | PurpleCipherContext *hash = hctx->hash; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
829 | guchar *inner_hash; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
830 | size_t hash_len; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
831 | gboolean result; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
832 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
833 | 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
|
834 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
835 | 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
|
836 | 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
|
837 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
838 | 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
|
839 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
840 | 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
|
841 | 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
|
842 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
843 | g_free(inner_hash); |
|
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 | 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
|
846 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
847 | return result; |
|
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 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
850 | static void |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
851 | hmac_uninit(PurpleCipherContext *context) |
|
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 | struct HMAC_Context *hctx; |
|
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 | 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
|
856 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
857 | 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
|
858 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
859 | g_free(hctx); |
|
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 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
862 | static void |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
863 | 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
|
864 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
865 | 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
|
866 | int blocksize, i; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
867 | guchar *ipad; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
868 | guchar *full_key; |
|
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 | 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
|
871 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
872 | g_free(hctx->opad); |
|
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 | blocksize = hctx->blocksize; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
875 | ipad = g_malloc(blocksize); |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
876 | 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
|
877 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
878 | if (key_len > blocksize) { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
879 | 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
|
880 | 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
|
881 | 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
|
882 | 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
|
883 | } else |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
884 | 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
|
885 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
886 | if (key_len < blocksize) { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
887 | 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
|
888 | 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
|
889 | } |
|
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 | 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
|
892 | 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
|
893 | 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
|
894 | } |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
895 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
896 | g_free(full_key); |
|
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 | 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
|
899 | 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
|
900 | g_free(ipad); |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
901 | } |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
902 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
903 | static void |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
904 | 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
|
905 | { |
|
22108
cb9819851163
Squash some compiler warnings, some from my -Wstrict-prototypes fixing.
Richard Laager <rlaager@pidgin.im>
parents:
22025
diff
changeset
|
906 | 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
|
907 | } |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
908 | |
|
25888
d0fdd378a635
Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents:
25859
diff
changeset
|
909 | static size_t |
|
22025
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
910 | 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
|
911 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
912 | 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
|
913 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
914 | return hctx->blocksize; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
915 | } |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
916 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
917 | static PurpleCipherOps HMACOps = { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
918 | 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
|
919 | 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
|
920 | hmac_init, /* init */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
921 | hmac_reset, /* reset */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
922 | hmac_uninit, /* uninit */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
923 | NULL, /* set iv */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
924 | hmac_append, /* append */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
925 | hmac_digest, /* digest */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
926 | NULL, /* encrypt */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
927 | NULL, /* decrypt */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
928 | NULL, /* set salt */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
929 | NULL, /* get salt size */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
930 | 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
|
931 | NULL, /* get key size */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
932 | NULL, /* set batch mode */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
933 | NULL, /* get batch mode */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
934 | 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
|
935 | hmac_set_key_with_len /* set key with len */ |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
936 | }; |
|
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
937 | |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
938 | /****************************************************************************** |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
939 | * DES |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
940 | *****************************************************************************/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
941 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
942 | typedef struct _des_ctx |
|
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 | guint32 encrypt_subkeys[32]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
945 | guint32 decrypt_subkeys[32]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
946 | } des_ctx[1]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
947 | |
|
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 | * 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
|
950 | */ |
|
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
|
951 | static const guint32 sbox1[64] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
952 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
953 | 0x00808200, 0x00000000, 0x00008000, 0x00808202, 0x00808002, 0x00008202, 0x00000002, 0x00008000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
954 | 0x00000200, 0x00808200, 0x00808202, 0x00000200, 0x00800202, 0x00808002, 0x00800000, 0x00000002, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
955 | 0x00000202, 0x00800200, 0x00800200, 0x00008200, 0x00008200, 0x00808000, 0x00808000, 0x00800202, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
956 | 0x00008002, 0x00800002, 0x00800002, 0x00008002, 0x00000000, 0x00000202, 0x00008202, 0x00800000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
957 | 0x00008000, 0x00808202, 0x00000002, 0x00808000, 0x00808200, 0x00800000, 0x00800000, 0x00000200, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
958 | 0x00808002, 0x00008000, 0x00008200, 0x00800002, 0x00000200, 0x00000002, 0x00800202, 0x00008202, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
959 | 0x00808202, 0x00008002, 0x00808000, 0x00800202, 0x00800002, 0x00000202, 0x00008202, 0x00808200, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
960 | 0x00000202, 0x00800200, 0x00800200, 0x00000000, 0x00008002, 0x00008200, 0x00000000, 0x00808002 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
961 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
962 | |
|
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
|
963 | static const guint32 sbox2[64] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
964 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
965 | 0x40084010, 0x40004000, 0x00004000, 0x00084010, 0x00080000, 0x00000010, 0x40080010, 0x40004010, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
966 | 0x40000010, 0x40084010, 0x40084000, 0x40000000, 0x40004000, 0x00080000, 0x00000010, 0x40080010, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
967 | 0x00084000, 0x00080010, 0x40004010, 0x00000000, 0x40000000, 0x00004000, 0x00084010, 0x40080000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
968 | 0x00080010, 0x40000010, 0x00000000, 0x00084000, 0x00004010, 0x40084000, 0x40080000, 0x00004010, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
969 | 0x00000000, 0x00084010, 0x40080010, 0x00080000, 0x40004010, 0x40080000, 0x40084000, 0x00004000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
970 | 0x40080000, 0x40004000, 0x00000010, 0x40084010, 0x00084010, 0x00000010, 0x00004000, 0x40000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
971 | 0x00004010, 0x40084000, 0x00080000, 0x40000010, 0x00080010, 0x40004010, 0x40000010, 0x00080010, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
972 | 0x00084000, 0x00000000, 0x40004000, 0x00004010, 0x40000000, 0x40080010, 0x40084010, 0x00084000 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
973 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
974 | |
|
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
|
975 | static const guint32 sbox3[64] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
976 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
977 | 0x00000104, 0x04010100, 0x00000000, 0x04010004, 0x04000100, 0x00000000, 0x00010104, 0x04000100, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
978 | 0x00010004, 0x04000004, 0x04000004, 0x00010000, 0x04010104, 0x00010004, 0x04010000, 0x00000104, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
979 | 0x04000000, 0x00000004, 0x04010100, 0x00000100, 0x00010100, 0x04010000, 0x04010004, 0x00010104, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
980 | 0x04000104, 0x00010100, 0x00010000, 0x04000104, 0x00000004, 0x04010104, 0x00000100, 0x04000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
981 | 0x04010100, 0x04000000, 0x00010004, 0x00000104, 0x00010000, 0x04010100, 0x04000100, 0x00000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
982 | 0x00000100, 0x00010004, 0x04010104, 0x04000100, 0x04000004, 0x00000100, 0x00000000, 0x04010004, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
983 | 0x04000104, 0x00010000, 0x04000000, 0x04010104, 0x00000004, 0x00010104, 0x00010100, 0x04000004, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
984 | 0x04010000, 0x04000104, 0x00000104, 0x04010000, 0x00010104, 0x00000004, 0x04010004, 0x00010100 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
985 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
986 | |
|
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
|
987 | static const guint32 sbox4[64] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
988 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
989 | 0x80401000, 0x80001040, 0x80001040, 0x00000040, 0x00401040, 0x80400040, 0x80400000, 0x80001000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
990 | 0x00000000, 0x00401000, 0x00401000, 0x80401040, 0x80000040, 0x00000000, 0x00400040, 0x80400000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
991 | 0x80000000, 0x00001000, 0x00400000, 0x80401000, 0x00000040, 0x00400000, 0x80001000, 0x00001040, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
992 | 0x80400040, 0x80000000, 0x00001040, 0x00400040, 0x00001000, 0x00401040, 0x80401040, 0x80000040, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
993 | 0x00400040, 0x80400000, 0x00401000, 0x80401040, 0x80000040, 0x00000000, 0x00000000, 0x00401000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
994 | 0x00001040, 0x00400040, 0x80400040, 0x80000000, 0x80401000, 0x80001040, 0x80001040, 0x00000040, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
995 | 0x80401040, 0x80000040, 0x80000000, 0x00001000, 0x80400000, 0x80001000, 0x00401040, 0x80400040, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
996 | 0x80001000, 0x00001040, 0x00400000, 0x80401000, 0x00000040, 0x00400000, 0x00001000, 0x00401040 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
997 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
998 | |
|
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
|
999 | static const guint32 sbox5[64] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1000 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1001 | 0x00000080, 0x01040080, 0x01040000, 0x21000080, 0x00040000, 0x00000080, 0x20000000, 0x01040000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1002 | 0x20040080, 0x00040000, 0x01000080, 0x20040080, 0x21000080, 0x21040000, 0x00040080, 0x20000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1003 | 0x01000000, 0x20040000, 0x20040000, 0x00000000, 0x20000080, 0x21040080, 0x21040080, 0x01000080, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1004 | 0x21040000, 0x20000080, 0x00000000, 0x21000000, 0x01040080, 0x01000000, 0x21000000, 0x00040080, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1005 | 0x00040000, 0x21000080, 0x00000080, 0x01000000, 0x20000000, 0x01040000, 0x21000080, 0x20040080, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1006 | 0x01000080, 0x20000000, 0x21040000, 0x01040080, 0x20040080, 0x00000080, 0x01000000, 0x21040000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1007 | 0x21040080, 0x00040080, 0x21000000, 0x21040080, 0x01040000, 0x00000000, 0x20040000, 0x21000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1008 | 0x00040080, 0x01000080, 0x20000080, 0x00040000, 0x00000000, 0x20040000, 0x01040080, 0x20000080 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1009 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1010 | |
|
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
|
1011 | static const guint32 sbox6[64] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1012 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1013 | 0x10000008, 0x10200000, 0x00002000, 0x10202008, 0x10200000, 0x00000008, 0x10202008, 0x00200000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1014 | 0x10002000, 0x00202008, 0x00200000, 0x10000008, 0x00200008, 0x10002000, 0x10000000, 0x00002008, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1015 | 0x00000000, 0x00200008, 0x10002008, 0x00002000, 0x00202000, 0x10002008, 0x00000008, 0x10200008, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1016 | 0x10200008, 0x00000000, 0x00202008, 0x10202000, 0x00002008, 0x00202000, 0x10202000, 0x10000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1017 | 0x10002000, 0x00000008, 0x10200008, 0x00202000, 0x10202008, 0x00200000, 0x00002008, 0x10000008, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1018 | 0x00200000, 0x10002000, 0x10000000, 0x00002008, 0x10000008, 0x10202008, 0x00202000, 0x10200000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1019 | 0x00202008, 0x10202000, 0x00000000, 0x10200008, 0x00000008, 0x00002000, 0x10200000, 0x00202008, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1020 | 0x00002000, 0x00200008, 0x10002008, 0x00000000, 0x10202000, 0x10000000, 0x00200008, 0x10002008 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1021 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1022 | |
|
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
|
1023 | static const guint32 sbox7[64] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1024 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1025 | 0x00100000, 0x02100001, 0x02000401, 0x00000000, 0x00000400, 0x02000401, 0x00100401, 0x02100400, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1026 | 0x02100401, 0x00100000, 0x00000000, 0x02000001, 0x00000001, 0x02000000, 0x02100001, 0x00000401, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1027 | 0x02000400, 0x00100401, 0x00100001, 0x02000400, 0x02000001, 0x02100000, 0x02100400, 0x00100001, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1028 | 0x02100000, 0x00000400, 0x00000401, 0x02100401, 0x00100400, 0x00000001, 0x02000000, 0x00100400, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1029 | 0x02000000, 0x00100400, 0x00100000, 0x02000401, 0x02000401, 0x02100001, 0x02100001, 0x00000001, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1030 | 0x00100001, 0x02000000, 0x02000400, 0x00100000, 0x02100400, 0x00000401, 0x00100401, 0x02100400, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1031 | 0x00000401, 0x02000001, 0x02100401, 0x02100000, 0x00100400, 0x00000000, 0x00000001, 0x02100401, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1032 | 0x00000000, 0x00100401, 0x02100000, 0x00000400, 0x02000001, 0x02000400, 0x00000400, 0x00100001 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1033 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1034 | |
|
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
|
1035 | static const guint32 sbox8[64] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1036 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1037 | 0x08000820, 0x00000800, 0x00020000, 0x08020820, 0x08000000, 0x08000820, 0x00000020, 0x08000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1038 | 0x00020020, 0x08020000, 0x08020820, 0x00020800, 0x08020800, 0x00020820, 0x00000800, 0x00000020, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1039 | 0x08020000, 0x08000020, 0x08000800, 0x00000820, 0x00020800, 0x00020020, 0x08020020, 0x08020800, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1040 | 0x00000820, 0x00000000, 0x00000000, 0x08020020, 0x08000020, 0x08000800, 0x00020820, 0x00020000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1041 | 0x00020820, 0x00020000, 0x08020800, 0x00000800, 0x00000020, 0x08020020, 0x00000800, 0x00020820, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1042 | 0x08000800, 0x00000020, 0x08000020, 0x08020000, 0x08020020, 0x08000000, 0x00020000, 0x08000820, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1043 | 0x00000000, 0x08020820, 0x00020020, 0x08000020, 0x08020000, 0x08000800, 0x08000820, 0x00000000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1044 | 0x08020820, 0x00020800, 0x00020800, 0x00000820, 0x00000820, 0x00020020, 0x08000000, 0x08020800 |
|
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 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1047 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1048 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1049 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1050 | * * 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
|
1051 | * * In this implementation several speed improvements are done. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1052 | * */ |
|
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
|
1053 | static const guint32 leftkey_swap[16] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1054 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1055 | 0x00000000, 0x00000001, 0x00000100, 0x00000101, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1056 | 0x00010000, 0x00010001, 0x00010100, 0x00010101, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1057 | 0x01000000, 0x01000001, 0x01000100, 0x01000101, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1058 | 0x01010000, 0x01010001, 0x01010100, 0x01010101 |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1059 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1060 | |
|
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
|
1061 | static const guint32 rightkey_swap[16] = |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1062 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1063 | 0x00000000, 0x01000000, 0x00010000, 0x01010000, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1064 | 0x00000100, 0x01000100, 0x00010100, 0x01010100, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1065 | 0x00000001, 0x01000001, 0x00010001, 0x01010001, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1066 | 0x00000101, 0x01000101, 0x00010101, 0x01010101, |
|
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 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1069 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1070 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1071 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1072 | * Numbers of left shifts per round for encryption subkey schedule |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1073 | * To calculate the decryption key scheduling we just reverse the |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1074 | * 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
|
1075 | * subkey schedule. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1076 | */ |
|
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
|
1077 | static const guint8 encrypt_rotate_tab[16] = |
|
11335
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 | 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
|
1080 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1081 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1082 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1083 | * Macro to swap bits across two words |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1084 | **/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1085 | #define DO_PERMUTATION(a, temp, b, offset, mask) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1086 | temp = ((a>>offset) ^ b) & mask; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1087 | b ^= temp; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1088 | a ^= temp<<offset; |
|
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 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1091 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1092 | * 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
|
1093 | **/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1094 | #define INITIAL_PERMUTATION(left, temp, right) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1095 | DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1096 | DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1097 | DO_PERMUTATION(right, temp, left, 2, 0x33333333) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1098 | DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1099 | DO_PERMUTATION(left, temp, right, 1, 0x55555555) |
|
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 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1102 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1103 | * The 'inverse initial permutation' |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1104 | **/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1105 | #define FINAL_PERMUTATION(left, temp, right) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1106 | DO_PERMUTATION(left, temp, right, 1, 0x55555555) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1107 | DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1108 | DO_PERMUTATION(right, temp, left, 2, 0x33333333) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1109 | DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1110 | DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1111 | |
|
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 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1114 | * A full DES round including 'expansion function', 'sbox substitution' |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1115 | * 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
|
1116 | **/ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1117 | #define DES_ROUND(from, to, work, subkey) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1118 | work = ((from<<1) | (from>>31)) ^ *subkey++; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1119 | to ^= sbox8[ work & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1120 | to ^= sbox6[ (work>>8) & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1121 | to ^= sbox4[ (work>>16) & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1122 | to ^= sbox2[ (work>>24) & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1123 | work = ((from>>3) | (from<<29)) ^ *subkey++; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1124 | to ^= sbox7[ work & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1125 | to ^= sbox5[ (work>>8) & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1126 | to ^= sbox3[ (work>>16) & 0x3f ]; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1127 | to ^= sbox1[ (work>>24) & 0x3f ]; |
|
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 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1130 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1131 | * Macros to convert 8 bytes from/to 32bit words |
|
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 READ_64BIT_DATA(data, left, right) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1134 | 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
|
1135 | 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
|
1136 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1137 | #define WRITE_64BIT_DATA(data, left, right) \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1138 | data[0] = (left >> 24) &0xff; data[1] = (left >> 16) &0xff; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1139 | data[2] = (left >> 8) &0xff; data[3] = left &0xff; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1140 | data[4] = (right >> 24) &0xff; data[5] = (right >> 16) &0xff; \ |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1141 | data[6] = (right >> 8) &0xff; data[7] = right &0xff; |
|
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 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1146 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1147 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1148 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1149 | * des_key_schedule(): Calculate 16 subkeys pairs (even/odd) for |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1150 | * 16 encryption rounds. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1151 | * To calculate subkeys for decryption the caller |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1152 | * have to reorder the generated 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 | * rawkey: 8 Bytes of key data |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1155 | * subkey: Array of at least 32 guint32s. Will be filled |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1156 | * with calculated subkeys. |
|
25888
d0fdd378a635
Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents:
25859
diff
changeset
|
1157 | * |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1158 | **/ |
| 11597 | 1159 | static void |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1160 | des_key_schedule (const guint8 * rawkey, guint32 * subkey) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1161 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1162 | guint32 left, right, work; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1163 | int round; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1164 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1165 | READ_64BIT_DATA (rawkey, left, right) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1166 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1167 | DO_PERMUTATION (right, work, left, 4, 0x0f0f0f0f) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1168 | DO_PERMUTATION (right, work, left, 0, 0x10101010) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1169 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1170 | 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
|
1171 | | (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
|
1172 | | (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
|
1173 | | (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
|
1174 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1175 | left &= 0x0fffffff; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1176 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1177 | 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
|
1178 | | (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
|
1179 | | (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
|
1180 | | (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
|
1181 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1182 | right &= 0x0fffffff; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1183 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1184 | for (round = 0; round < 16; ++round) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1185 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1186 | 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
|
1187 | 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
|
1188 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1189 | *subkey++ = ((left << 4) & 0x24000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1190 | | ((left << 28) & 0x10000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1191 | | ((left << 14) & 0x08000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1192 | | ((left << 18) & 0x02080000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1193 | | ((left << 6) & 0x01000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1194 | | ((left << 9) & 0x00200000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1195 | | ((left >> 1) & 0x00100000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1196 | | ((left << 10) & 0x00040000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1197 | | ((left << 2) & 0x00020000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1198 | | ((left >> 10) & 0x00010000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1199 | | ((right >> 13) & 0x00002000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1200 | | ((right >> 4) & 0x00001000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1201 | | ((right << 6) & 0x00000800) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1202 | | ((right >> 1) & 0x00000400) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1203 | | ((right >> 14) & 0x00000200) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1204 | | (right & 0x00000100) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1205 | | ((right >> 5) & 0x00000020) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1206 | | ((right >> 10) & 0x00000010) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1207 | | ((right >> 3) & 0x00000008) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1208 | | ((right >> 18) & 0x00000004) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1209 | | ((right >> 26) & 0x00000002) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1210 | | ((right >> 24) & 0x00000001); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1211 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1212 | *subkey++ = ((left << 15) & 0x20000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1213 | | ((left << 17) & 0x10000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1214 | | ((left << 10) & 0x08000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1215 | | ((left << 22) & 0x04000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1216 | | ((left >> 2) & 0x02000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1217 | | ((left << 1) & 0x01000000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1218 | | ((left << 16) & 0x00200000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1219 | | ((left << 11) & 0x00100000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1220 | | ((left << 3) & 0x00080000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1221 | | ((left >> 6) & 0x00040000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1222 | | ((left << 15) & 0x00020000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1223 | | ((left >> 4) & 0x00010000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1224 | | ((right >> 2) & 0x00002000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1225 | | ((right << 8) & 0x00001000) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1226 | | ((right >> 14) & 0x00000808) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1227 | | ((right >> 9) & 0x00000400) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1228 | | ((right) & 0x00000200) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1229 | | ((right << 7) & 0x00000100) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1230 | | ((right >> 7) & 0x00000020) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1231 | | ((right >> 3) & 0x00000011) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1232 | | ((right << 2) & 0x00000004) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1233 | | ((right >> 21) & 0x00000002); |
|
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 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1237 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1238 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1239 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1240 | * 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
|
1241 | * Does not check parity bits, but simply ignore them. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1242 | * Does not check for weak keys. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1243 | **/ |
| 11597 | 1244 | static void |
| 15884 | 1245 | des_set_key (PurpleCipherContext *context, const guchar * key) |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1246 | { |
| 15884 | 1247 | 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
|
1248 | int i; |
|
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 | des_key_schedule (key, ctx->encrypt_subkeys); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1251 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1252 | for(i=0; i<32; i+=2) |
|
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 | ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[30-i]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1255 | ctx->decrypt_subkeys[i+1] = ctx->encrypt_subkeys[31-i]; |
|
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 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1259 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1260 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1261 | /* |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1262 | * Electronic Codebook Mode DES encryption/decryption of data according |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1263 | * to 'mode'. |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1264 | **/ |
| 11597 | 1265 | static int |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1266 | 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
|
1267 | { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1268 | guint32 left, right, work; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1269 | guint32 *keys; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1270 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1271 | keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1272 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1273 | READ_64BIT_DATA (from, left, right) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1274 | INITIAL_PERMUTATION (left, work, right) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1275 | |
|
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 | 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
|
1281 | 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
|
1282 | 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
|
1283 | 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
|
1284 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1285 | FINAL_PERMUTATION (right, work, left) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1286 | WRITE_64BIT_DATA (to, right, left) |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1287 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1288 | return 0; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1289 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1290 | |
| 11597 | 1291 | static gint |
| 15884 | 1292 | des_encrypt(PurpleCipherContext *context, const guchar data[], |
| 11597 | 1293 | size_t len, guchar output[], size_t *outlen) { |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1294 | int offset = 0; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1295 | int i = 0; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1296 | int tmp; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1297 | 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
|
1298 | while(offset+8<=len) { |
| 15884 | 1299 | des_ecb_crypt(purple_cipher_context_get_data(context), |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1300 | data+offset, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1301 | output+offset, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1302 | 0); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1303 | offset+=8; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1304 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1305 | *outlen = len; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1306 | if(offset<len) { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1307 | *outlen += len - offset; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1308 | tmp = offset; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1309 | while(tmp<len) { |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1310 | buf[i++] = data[tmp]; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1311 | tmp++; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1312 | } |
| 15884 | 1313 | des_ecb_crypt(purple_cipher_context_get_data(context), |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1314 | buf, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1315 | output+offset, |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1316 | 0); |
|
25888
d0fdd378a635
Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents:
25859
diff
changeset
|
1317 | } |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1318 | return 0; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1319 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1320 | |
|
22024
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1321 | static gint |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1322 | 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
|
1323 | 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
|
1324 | int offset = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1325 | int i = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1326 | int tmp; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1327 | 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
|
1328 | 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
|
1329 | 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
|
1330 | data+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1331 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1332 | 1); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1333 | offset+=8; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1334 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1335 | *outlen = len; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1336 | if(offset<len) { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1337 | *outlen += len - offset; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1338 | tmp = offset; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1339 | while(tmp<len) { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1340 | 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
|
1341 | tmp++; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1342 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1343 | 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
|
1344 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1345 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1346 | 1); |
|
25888
d0fdd378a635
Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents:
25859
diff
changeset
|
1347 | } |
|
22024
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1348 | return 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1349 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1350 | |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1351 | static void |
| 15884 | 1352 | des_init(PurpleCipherContext *context, gpointer extra) { |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1353 | struct _des_ctx *mctx; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1354 | mctx = g_new0(struct _des_ctx, 1); |
| 15884 | 1355 | purple_cipher_context_set_data(context, mctx); |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1356 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1357 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1358 | static void |
| 15884 | 1359 | des_uninit(PurpleCipherContext *context) { |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1360 | struct _des_ctx *des_context; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1361 | |
| 15884 | 1362 | des_context = purple_cipher_context_get_data(context); |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1363 | memset(des_context, 0, sizeof(des_context)); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1364 | |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1365 | g_free(des_context); |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1366 | des_context = NULL; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1367 | } |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1368 | |
| 15884 | 1369 | 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
|
1370 | NULL, /* Set option */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1371 | NULL, /* Get option */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1372 | des_init, /* init */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1373 | NULL, /* reset */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1374 | des_uninit, /* uninit */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1375 | NULL, /* set iv */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1376 | NULL, /* append */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1377 | NULL, /* digest */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1378 | des_encrypt, /* encrypt */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1379 | des_decrypt, /* decrypt */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1380 | NULL, /* set salt */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1381 | 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
|
1382 | 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
|
1383 | 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
|
1384 | 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
|
1385 | 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
|
1386 | NULL, /* get block size */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
1387 | 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
|
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 | /****************************************************************************** |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1391 | * Triple-DES |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1392 | *****************************************************************************/ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1393 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1394 | 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
|
1395 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1396 | PurpleCipherBatchMode mode; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1397 | guchar iv[8]; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1398 | /* 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
|
1399 | 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
|
1400 | /* 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
|
1401 | 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
|
1402 | /* 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
|
1403 | 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
|
1404 | } des3_ctx[1]; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1405 | |
|
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 | * 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
|
1408 | * 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
|
1409 | * 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
|
1410 | **/ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1411 | static void |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1412 | 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
|
1413 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1414 | 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
|
1415 | int i; |
|
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 | 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
|
1418 | 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
|
1419 | 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
|
1420 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1421 | 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
|
1422 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1423 | 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
|
1424 | 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
|
1425 | 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
|
1426 | 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
|
1427 | 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
|
1428 | 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
|
1429 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1430 | } |
|
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 | static gint |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1433 | 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
|
1434 | 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
|
1435 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1436 | int offset = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1437 | int i = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1438 | int tmp; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1439 | 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
|
1440 | 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
|
1441 | 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
|
1442 | data+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1443 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1444 | 0); |
|
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->key2, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1446 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1447 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1448 | 1); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1449 | 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
|
1450 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1451 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1452 | 0); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1453 | offset += 8; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1454 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1455 | *outlen = len; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1456 | if (offset < len) { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1457 | *outlen += len - offset; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1458 | tmp = offset; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1459 | 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
|
1460 | while (tmp < len) { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1461 | 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
|
1462 | tmp++; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1463 | } |
|
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->key1, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1465 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1466 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1467 | 0); |
|
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->key2, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1469 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1470 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1471 | 1); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1472 | 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
|
1473 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1474 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1475 | 0); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1476 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1477 | return 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1478 | } |
|
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 | static gint |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1481 | 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
|
1482 | 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
|
1483 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1484 | int offset = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1485 | int i = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1486 | int tmp; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1487 | guint8 buf[8]; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1488 | 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
|
1489 | 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
|
1490 | 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
|
1491 | 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
|
1492 | 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
|
1493 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1494 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1495 | 0); |
|
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->key2, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1497 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1498 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1499 | 1); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1500 | 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
|
1501 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1502 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1503 | 0); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1504 | 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
|
1505 | offset += 8; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1506 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1507 | *outlen = len; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1508 | if (offset < len) { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1509 | *outlen += len - offset; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1510 | tmp = offset; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1511 | i = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1512 | while (tmp < len) { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1513 | 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
|
1514 | tmp++; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1515 | } |
|
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->key1, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1517 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1518 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1519 | 0); |
|
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->key2, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1521 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1522 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1523 | 1); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1524 | 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
|
1525 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1526 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1527 | 0); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1528 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1529 | return 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1530 | } |
|
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 | static gint |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1533 | 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
|
1534 | 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
|
1535 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1536 | 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
|
1537 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1538 | 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
|
1539 | 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
|
1540 | } 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
|
1541 | 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
|
1542 | } else { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1543 | 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
|
1544 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1545 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1546 | return 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1547 | } |
|
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 | static gint |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1550 | 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
|
1551 | 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
|
1552 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1553 | int offset = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1554 | int i = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1555 | int tmp; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1556 | 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
|
1557 | 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
|
1558 | /* 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
|
1559 | 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
|
1560 | data+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1561 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1562 | 1); |
|
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->key2, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1564 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1565 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1566 | 0); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1567 | 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
|
1568 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1569 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1570 | 1); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1571 | offset+=8; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1572 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1573 | *outlen = len; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1574 | if (offset < len) { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1575 | *outlen += len - offset; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1576 | tmp = offset; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1577 | 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
|
1578 | while (tmp < len) { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1579 | 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
|
1580 | tmp++; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1581 | } |
|
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->key3, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1583 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1584 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1585 | 1); |
|
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->key2, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1587 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1588 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1589 | 0); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1590 | 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
|
1591 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1592 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1593 | 1); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1594 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1595 | return 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1596 | } |
|
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 | static gint |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1599 | 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
|
1600 | 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
|
1601 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1602 | int offset = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1603 | int i = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1604 | int tmp; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1605 | 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
|
1606 | guint8 link[8]; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1607 | 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
|
1608 | 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
|
1609 | 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
|
1610 | data+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1611 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1612 | 1); |
|
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->key2, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1614 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1615 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1616 | 0); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1617 | 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
|
1618 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1619 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1620 | 1); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1621 | 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
|
1622 | 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
|
1623 | 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
|
1624 | offset+=8; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1625 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1626 | *outlen = len; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1627 | if(offset<len) { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1628 | *outlen += len - offset; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1629 | tmp = offset; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1630 | 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
|
1631 | i = 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1632 | while(tmp<len) { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1633 | 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
|
1634 | tmp++; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1635 | } |
|
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->key3, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1637 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1638 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1639 | 1); |
|
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->key2, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1641 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1642 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1643 | 0); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1644 | 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
|
1645 | buf, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1646 | output+offset, |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1647 | 1); |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1648 | 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
|
1649 | 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
|
1650 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1651 | return 0; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1652 | } |
|
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 | static gint |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1655 | 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
|
1656 | 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
|
1657 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1658 | 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
|
1659 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1660 | 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
|
1661 | 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
|
1662 | } 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
|
1663 | 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
|
1664 | } else { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1665 | 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
|
1666 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1667 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1668 | return 0; |
|
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 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1671 | static void |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1672 | 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
|
1673 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1674 | 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
|
1675 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1676 | ctx->mode = mode; |
|
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 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1679 | static PurpleCipherBatchMode |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1680 | 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
|
1681 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1682 | 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
|
1683 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1684 | return ctx->mode; |
|
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 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1687 | static void |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1688 | 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
|
1689 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1690 | 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
|
1691 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1692 | 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
|
1693 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1694 | 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
|
1695 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1696 | 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
|
1697 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1698 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1699 | static void |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1700 | 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
|
1701 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1702 | 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
|
1703 | 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
|
1704 | 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
|
1705 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1706 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1707 | static void |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1708 | 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
|
1709 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1710 | 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
|
1711 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1712 | 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
|
1713 | 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
|
1714 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1715 | 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
|
1716 | des3_context = NULL; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1717 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1718 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1719 | static PurpleCipherOps DES3Ops = { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1720 | NULL, /* Set option */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1721 | NULL, /* Get option */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1722 | des3_init, /* init */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1723 | NULL, /* reset */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1724 | des3_uninit, /* uninit */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1725 | 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
|
1726 | NULL, /* append */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1727 | NULL, /* digest */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1728 | des3_encrypt, /* encrypt */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1729 | des3_decrypt, /* decrypt */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1730 | NULL, /* set salt */ |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
1731 | 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
|
1732 | 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
|
1733 | 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
|
1734 | 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
|
1735 | 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
|
1736 | NULL, /* get block size */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
1737 | NULL /* set key with len */ |
|
11335
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1738 | }; |
|
8e8d266179bb
[gaim-migrate @ 13548]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11333
diff
changeset
|
1739 | |
|
11329
5ca3cf4e502e
[gaim-migrate @ 13541]
Thomas Butter <tbutter@users.sourceforge.net>
parents:
11183
diff
changeset
|
1740 | /******************************************************************************* |
| 10684 | 1741 | * SHA-1 |
| 1742 | ******************************************************************************/ | |
|
22025
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
1743 | #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
|
1744 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1745 | 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
|
1746 | 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
|
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 | /* 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
|
1749 | 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
|
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 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1752 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1753 | #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
|
1754 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1755 | 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
|
1756 | 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
|
1757 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1758 | 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
|
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 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1761 | 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
|
1762 | 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
|
1763 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1764 | 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
|
1765 | } |
|
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 | 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
|
1768 | 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
|
1769 | 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
|
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 | 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
|
1772 | 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
|
1773 | } |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1774 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1775 | 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
|
1776 | 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
|
1777 | 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
|
1778 | 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
|
1779 | 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
|
1780 | 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
|
1781 | 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
|
1782 | 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
|
1783 | 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
|
1784 | 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
|
1785 | 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
|
1786 | 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
|
1787 | 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
|
1788 | 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
|
1789 | 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
|
1790 | 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
|
1791 | 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
|
1792 | 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
|
1793 | 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
|
1794 | }; |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1795 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1796 | #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
|
1797 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
1798 | #define SHA1_HMAC_BLOCK_SIZE 64 |
| 10684 | 1799 | #define SHA1_ROTL(X,n) ((((X) << (n)) | ((X) >> (32-(n)))) & 0xFFFFFFFF) |
| 1800 | ||
| 1801 | struct SHA1Context { | |
| 1802 | guint32 H[5]; | |
| 1803 | guint32 W[80]; | |
| 1804 | ||
|
13219
5b0a1fd8bc84
[gaim-migrate @ 15582]
Richard Laager <rlaager@pidgin.im>
parents:
12389
diff
changeset
|
1805 | gint lenW; |
| 10684 | 1806 | |
| 1807 | guint32 sizeHi; | |
| 1808 | guint32 sizeLo; | |
| 1809 | }; | |
| 1810 | ||
| 1811 | static void | |
| 1812 | sha1_hash_block(struct SHA1Context *sha1_ctx) { | |
| 1813 | gint i; | |
| 1814 | guint32 A, B, C, D, E, T; | |
| 1815 | ||
| 1816 | for(i = 16; i < 80; i++) { | |
| 1817 | sha1_ctx->W[i] = SHA1_ROTL(sha1_ctx->W[i - 3] ^ | |
| 1818 | sha1_ctx->W[i - 8] ^ | |
| 1819 | sha1_ctx->W[i - 14] ^ | |
| 1820 | sha1_ctx->W[i - 16], 1); | |
| 1821 | } | |
| 1822 | ||
| 1823 | A = sha1_ctx->H[0]; | |
| 1824 | B = sha1_ctx->H[1]; | |
| 1825 | C = sha1_ctx->H[2]; | |
| 1826 | D = sha1_ctx->H[3]; | |
| 1827 | E = sha1_ctx->H[4]; | |
| 1828 | ||
| 1829 | for(i = 0; i < 20; i++) { | |
| 1830 | T = (SHA1_ROTL(A, 5) + (((C ^ D) & B) ^ D) + E + sha1_ctx->W[i] + 0x5A827999) & 0xFFFFFFFF; | |
| 1831 | E = D; | |
| 1832 | D = C; | |
| 1833 | C = SHA1_ROTL(B, 30); | |
| 1834 | B = A; | |
| 1835 | A = T; | |
| 1836 | } | |
| 1837 | ||
| 1838 | for(i = 20; i < 40; i++) { | |
| 1839 | T = (SHA1_ROTL(A, 5) + (B ^ C ^ D) + E + sha1_ctx->W[i] + 0x6ED9EBA1) & 0xFFFFFFFF; | |
| 1840 | E = D; | |
| 1841 | D = C; | |
| 1842 | C = SHA1_ROTL(B, 30); | |
| 1843 | B = A; | |
| 1844 | A = T; | |
| 1845 | } | |
| 1846 | ||
| 1847 | for(i = 40; i < 60; i++) { | |
| 1848 | T = (SHA1_ROTL(A, 5) + ((B & C) | (D & (B | C))) + E + sha1_ctx->W[i] + 0x8F1BBCDC) & 0xFFFFFFFF; | |
| 1849 | E = D; | |
| 1850 | D = C; | |
| 1851 | C = SHA1_ROTL(B, 30); | |
| 1852 | B = A; | |
| 1853 | A = T; | |
| 1854 | } | |
| 1855 | ||
| 1856 | for(i = 60; i < 80; i++) { | |
| 1857 | T = (SHA1_ROTL(A, 5) + (B ^ C ^ D) + E + sha1_ctx->W[i] + 0xCA62C1D6) & 0xFFFFFFFF; | |
| 1858 | E = D; | |
| 1859 | D = C; | |
| 1860 | C = SHA1_ROTL(B, 30); | |
| 1861 | B = A; | |
| 1862 | A = T; | |
| 1863 | } | |
| 1864 | ||
| 1865 | sha1_ctx->H[0] += A; | |
| 1866 | sha1_ctx->H[1] += B; | |
| 1867 | sha1_ctx->H[2] += C; | |
| 1868 | sha1_ctx->H[3] += D; | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1869 | sha1_ctx->H[4] += E; |
| 10684 | 1870 | } |
| 1871 | ||
| 1872 | static void | |
| 15884 | 1873 | sha1_set_opt(PurpleCipherContext *context, const gchar *name, void *value) { |
| 10684 | 1874 | struct SHA1Context *ctx; |
| 1875 | ||
| 15884 | 1876 | ctx = purple_cipher_context_get_data(context); |
| 10684 | 1877 | |
|
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 | if(purple_strequal(name, "sizeHi")) { |
| 10684 | 1879 | 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
|
1880 | } else if(purple_strequal(name, "sizeLo")) { |
| 10684 | 1881 | 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
|
1882 | } else if(purple_strequal(name, "lenW")) { |
| 10684 | 1883 | ctx->lenW = GPOINTER_TO_INT(value); |
| 1884 | } | |
| 1885 | } | |
| 1886 | ||
| 1887 | static void * | |
| 15884 | 1888 | sha1_get_opt(PurpleCipherContext *context, const gchar *name) { |
| 10684 | 1889 | struct SHA1Context *ctx; |
| 1890 | ||
| 15884 | 1891 | ctx = purple_cipher_context_get_data(context); |
| 10684 | 1892 | |
|
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 | if(purple_strequal(name, "sizeHi")) { |
| 10684 | 1894 | 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
|
1895 | } else if(purple_strequal(name, "sizeLo")) { |
| 10684 | 1896 | 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
|
1897 | } else if(purple_strequal(name, "lenW")) { |
| 10684 | 1898 | return GINT_TO_POINTER(ctx->lenW); |
| 1899 | } | |
| 1900 | ||
| 1901 | return NULL; | |
| 1902 | } | |
| 1903 | ||
| 1904 | static void | |
| 15884 | 1905 | sha1_init(PurpleCipherContext *context, void *extra) { |
| 10684 | 1906 | struct SHA1Context *sha1_ctx; |
| 1907 | ||
| 1908 | sha1_ctx = g_new0(struct SHA1Context, 1); | |
| 1909 | ||
| 15884 | 1910 | purple_cipher_context_set_data(context, sha1_ctx); |
| 10684 | 1911 | |
| 15884 | 1912 | purple_cipher_context_reset(context, extra); |
| 10684 | 1913 | } |
| 1914 | ||
| 1915 | static void | |
| 15884 | 1916 | sha1_reset(PurpleCipherContext *context, void *extra) { |
| 10684 | 1917 | struct SHA1Context *sha1_ctx; |
| 1918 | gint i; | |
| 1919 | ||
| 15884 | 1920 | sha1_ctx = purple_cipher_context_get_data(context); |
| 10684 | 1921 | |
| 1922 | g_return_if_fail(sha1_ctx); | |
| 1923 | ||
| 1924 | sha1_ctx->lenW = 0; | |
| 1925 | sha1_ctx->sizeHi = 0; | |
| 1926 | sha1_ctx->sizeLo = 0; | |
| 1927 | ||
| 1928 | sha1_ctx->H[0] = 0x67452301; | |
| 1929 | sha1_ctx->H[1] = 0xEFCDAB89; | |
| 1930 | sha1_ctx->H[2] = 0x98BADCFE; | |
| 1931 | sha1_ctx->H[3] = 0x10325476; | |
| 1932 | sha1_ctx->H[4] = 0xC3D2E1F0; | |
| 1933 | ||
| 1934 | for(i = 0; i < 80; i++) | |
| 1935 | sha1_ctx->W[i] = 0; | |
| 1936 | } | |
| 1937 | ||
| 1938 | static void | |
| 15884 | 1939 | sha1_uninit(PurpleCipherContext *context) { |
| 10684 | 1940 | struct SHA1Context *sha1_ctx; |
| 1941 | ||
| 15884 | 1942 | purple_cipher_context_reset(context, NULL); |
| 10684 | 1943 | |
| 15884 | 1944 | sha1_ctx = purple_cipher_context_get_data(context); |
| 10684 | 1945 | |
| 1946 | memset(sha1_ctx, 0, sizeof(struct SHA1Context)); | |
| 1947 | ||
| 1948 | g_free(sha1_ctx); | |
| 1949 | sha1_ctx = NULL; | |
| 1950 | } | |
| 1951 | ||
| 1952 | ||
| 1953 | static void | |
| 15884 | 1954 | sha1_append(PurpleCipherContext *context, const guchar *data, size_t len) { |
| 10684 | 1955 | struct SHA1Context *sha1_ctx; |
| 1956 | gint i; | |
| 1957 | ||
| 15884 | 1958 | sha1_ctx = purple_cipher_context_get_data(context); |
| 10684 | 1959 | |
| 1960 | g_return_if_fail(sha1_ctx); | |
| 1961 | ||
| 1962 | for(i = 0; i < len; i++) { | |
| 1963 | sha1_ctx->W[sha1_ctx->lenW / 4] <<= 8; | |
| 1964 | sha1_ctx->W[sha1_ctx->lenW / 4] |= data[i]; | |
| 1965 | ||
| 1966 | if((++sha1_ctx->lenW) % 64 == 0) { | |
| 1967 | sha1_hash_block(sha1_ctx); | |
| 1968 | sha1_ctx->lenW = 0; | |
| 1969 | } | |
| 1970 | ||
| 1971 | sha1_ctx->sizeLo += 8; | |
| 1972 | sha1_ctx->sizeHi += (sha1_ctx->sizeLo < 8); | |
| 1973 | } | |
| 1974 | } | |
| 1975 | ||
| 1976 | static gboolean | |
| 15884 | 1977 | sha1_digest(PurpleCipherContext *context, size_t in_len, guchar digest[20], |
| 10687 | 1978 | size_t *out_len) |
| 1979 | { | |
| 10684 | 1980 | struct SHA1Context *sha1_ctx; |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1981 | guchar pad0x80 = 0x80, pad0x00 = 0x00; |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1982 | guchar padlen[8]; |
| 10684 | 1983 | gint i; |
| 1984 | ||
| 10687 | 1985 | g_return_val_if_fail(in_len >= 20, FALSE); |
| 10684 | 1986 | |
| 15884 | 1987 | sha1_ctx = purple_cipher_context_get_data(context); |
| 10684 | 1988 | |
| 1989 | g_return_val_if_fail(sha1_ctx, FALSE); | |
| 1990 | ||
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1991 | padlen[0] = (guchar)((sha1_ctx->sizeHi >> 24) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1992 | padlen[1] = (guchar)((sha1_ctx->sizeHi >> 16) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1993 | padlen[2] = (guchar)((sha1_ctx->sizeHi >> 8) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1994 | padlen[3] = (guchar)((sha1_ctx->sizeHi >> 0) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1995 | padlen[4] = (guchar)((sha1_ctx->sizeLo >> 24) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1996 | padlen[5] = (guchar)((sha1_ctx->sizeLo >> 16) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1997 | padlen[6] = (guchar)((sha1_ctx->sizeLo >> 8) & 255); |
|
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
1998 | padlen[7] = (guchar)((sha1_ctx->sizeLo >> 0) & 255); |
| 10684 | 1999 | |
| 2000 | /* pad with a 1, then zeroes, then length */ | |
| 15884 | 2001 | purple_cipher_context_append(context, &pad0x80, 1); |
| 10684 | 2002 | while(sha1_ctx->lenW != 56) |
| 15884 | 2003 | purple_cipher_context_append(context, &pad0x00, 1); |
| 2004 | purple_cipher_context_append(context, padlen, 8); | |
| 10684 | 2005 | |
| 2006 | for(i = 0; i < 20; i++) { | |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
2007 | digest[i] = (guchar)(sha1_ctx->H[i / 4] >> 24); |
| 10684 | 2008 | sha1_ctx->H[i / 4] <<= 8; |
| 2009 | } | |
| 2010 | ||
| 15884 | 2011 | purple_cipher_context_reset(context, NULL); |
| 10684 | 2012 | |
| 10687 | 2013 | if(out_len) |
| 2014 | *out_len = 20; | |
| 2015 | ||
| 10684 | 2016 | return TRUE; |
| 2017 | } | |
| 2018 | ||
| 15884 | 2019 | static PurpleCipherOps SHA1Ops = { |
| 10684 | 2020 | sha1_set_opt, /* Set Option */ |
| 2021 | sha1_get_opt, /* Get Option */ | |
| 2022 | sha1_init, /* init */ | |
| 2023 | sha1_reset, /* reset */ | |
| 2024 | sha1_uninit, /* uninit */ | |
| 2025 | NULL, /* set iv */ | |
| 2026 | sha1_append, /* append */ | |
| 2027 | sha1_digest, /* digest */ | |
| 2028 | NULL, /* encrypt */ | |
| 2029 | NULL, /* decrypt */ | |
| 2030 | NULL, /* set salt */ | |
| 2031 | NULL, /* get salt size */ | |
| 2032 | NULL, /* set key */ | |
|
16747
fc3608e1e661
I _think_ this is it for libpurple's padding...
Gary Kramlich <grim@reaperworld.com>
parents:
15884
diff
changeset
|
2033 | 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
|
2034 | 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
|
2035 | 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
|
2036 | 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
|
2037 | NULL /* set key with len */ |
| 10684 | 2038 | }; |
| 2039 | ||
|
27539
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2040 | #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
|
2041 | |
| 10684 | 2042 | /******************************************************************************* |
|
27383
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2043 | * SHA-256 |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2044 | ******************************************************************************/ |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2045 | #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
|
2046 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2047 | 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
|
2048 | 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
|
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 | /* 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
|
2051 | 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
|
2052 | } |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2053 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2054 | #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
|
2055 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2056 | 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
|
2057 | 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
|
2058 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2059 | 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
|
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 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2062 | 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
|
2063 | 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
|
2064 | { |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2065 | 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
|
2066 | } |
|
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 | 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
|
2069 | 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
|
2070 | 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
|
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 | 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
|
2073 | 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
|
2074 | } |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2075 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2076 | 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
|
2077 | 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
|
2078 | 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
|
2079 | 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
|
2080 | 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
|
2081 | 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
|
2082 | 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
|
2083 | 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
|
2084 | 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
|
2085 | 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
|
2086 | 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
|
2087 | 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
|
2088 | 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
|
2089 | 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
|
2090 | 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
|
2091 | 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
|
2092 | 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
|
2093 | 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
|
2094 | 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
|
2095 | }; |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2096 | |
|
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2097 | #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
|
2098 | |
|
27383
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2099 | #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
|
2100 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2101 | 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
|
2102 | { |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2103 | 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
|
2104 | 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
|
2105 | 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
|
2106 | 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
|
2107 | 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
|
2108 | 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
|
2109 | 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
|
2110 | 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
|
2111 | }; |
|
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 | struct SHA256Context { |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2114 | 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
|
2115 | 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
|
2116 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2117 | gint lenW; |
|
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 | guint32 sizeHi; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2120 | guint32 sizeLo; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2121 | }; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2122 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2123 | static void |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2124 | 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
|
2125 | gint i; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2126 | 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
|
2127 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2128 | 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
|
2129 | 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
|
2130 | (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
|
2131 | + 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
|
2132 | + (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
|
2133 | + 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
|
2134 | } |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2135 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2136 | 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
|
2137 | 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
|
2138 | 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
|
2139 | 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
|
2140 | 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
|
2141 | 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
|
2142 | 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
|
2143 | 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
|
2144 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2145 | 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
|
2146 | T1 = H |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2147 | + (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
|
2148 | + ((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
|
2149 | + 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
|
2150 | 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
|
2151 | + ((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
|
2152 | H = G; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2153 | G = F; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2154 | F = E; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2155 | 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
|
2156 | D = C; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2157 | C = B; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2158 | B = A; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2159 | 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
|
2160 | } |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2161 | |
|
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[0] += A; |
|
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[1] += B; |
|
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[2] += C; |
|
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[3] += D; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2166 | 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
|
2167 | 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
|
2168 | 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
|
2169 | 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
|
2170 | } |
|
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 | static void |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2173 | 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
|
2174 | 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
|
2175 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2176 | 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
|
2177 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2178 | 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
|
2179 | 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
|
2180 | } 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
|
2181 | 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
|
2182 | } 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
|
2183 | 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
|
2184 | } |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2185 | } |
|
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 | static void * |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2188 | 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
|
2189 | 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
|
2190 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2191 | 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
|
2192 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2193 | 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
|
2194 | 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
|
2195 | } 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
|
2196 | 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
|
2197 | } 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
|
2198 | 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
|
2199 | } |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2200 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2201 | return NULL; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2202 | } |
|
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 | static void |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2205 | 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
|
2206 | 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
|
2207 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2208 | 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
|
2209 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2210 | 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
|
2211 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2212 | 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
|
2213 | } |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2214 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2215 | static void |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2216 | 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
|
2217 | 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
|
2218 | gint i; |
|
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 = 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
|
2221 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2222 | 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
|
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->lenW = 0; |
|
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->sizeHi = 0; |
|
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->sizeLo = 0; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2227 | |
|
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[0] = 0x6a09e667; |
|
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[1] = 0xbb67ae85; |
|
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[2] = 0x3c6ef372; |
|
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[3] = 0xa54ff53a; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2232 | 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
|
2233 | 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
|
2234 | 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
|
2235 | 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
|
2236 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2237 | 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
|
2238 | 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
|
2239 | } |
|
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 | static void |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2242 | 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
|
2243 | 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
|
2244 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2245 | 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
|
2246 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2247 | 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
|
2248 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2249 | 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
|
2250 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2251 | 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
|
2252 | 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
|
2253 | } |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2254 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2255 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2256 | static void |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2257 | 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
|
2258 | 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
|
2259 | gint i; |
|
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 | 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
|
2262 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2263 | 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
|
2264 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2265 | 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
|
2266 | 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
|
2267 | 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
|
2268 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2269 | 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
|
2270 | 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
|
2271 | 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
|
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 | 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
|
2275 | 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
|
2276 | } |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2277 | } |
|
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 | static gboolean |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2280 | 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
|
2281 | 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
|
2282 | { |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2283 | 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
|
2284 | 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
|
2285 | 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
|
2286 | gint i; |
|
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(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
|
2289 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2290 | 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
|
2291 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2292 | 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
|
2293 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2294 | 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
|
2295 | 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
|
2296 | 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
|
2297 | 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
|
2298 | 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
|
2299 | 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
|
2300 | 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
|
2301 | 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
|
2302 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2303 | /* 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
|
2304 | 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
|
2305 | 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
|
2306 | 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
|
2307 | 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
|
2308 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2309 | 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
|
2310 | 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
|
2311 | 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
|
2312 | } |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2313 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2314 | 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
|
2315 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2316 | 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
|
2317 | *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
|
2318 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2319 | return TRUE; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2320 | } |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2321 | |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2322 | 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
|
2323 | 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
|
2324 | 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
|
2325 | 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
|
2326 | 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
|
2327 | 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
|
2328 | 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
|
2329 | 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
|
2330 | 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
|
2331 | NULL, /* encrypt */ |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2332 | NULL, /* decrypt */ |
|
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 salt */ |
|
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 salt size */ |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2335 | 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
|
2336 | 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
|
2337 | 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
|
2338 | 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
|
2339 | 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
|
2340 | 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
|
2341 | }; |
|
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2342 | |
|
27539
e94b84b12eb6
Use glib's SHA1, SHA256, and MD5 implementations when available (glib 2.16)
Paul Aurich <darkrain42@pidgin.im>
parents:
27497
diff
changeset
|
2343 | #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
|
2344 | |
|
27383
cbb399c19d87
An implementation of SHA-256. Created by copying libpurple's SHA-1
Mark Doliner <markdoliner@pidgin.im>
parents:
25888
diff
changeset
|
2345 | /******************************************************************************* |
|
17053
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2346 | * RC4 |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2347 | ******************************************************************************/ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2348 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2349 | struct RC4Context { |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2350 | guchar state[256]; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2351 | guchar x; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2352 | guchar y; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2353 | gint key_len; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2354 | }; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2355 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2356 | static void |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2357 | rc4_init(PurpleCipherContext *context, void *extra) { |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2358 | struct RC4Context *rc4_ctx; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2359 | 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
|
2360 | 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
|
2361 | purple_cipher_context_reset(context, extra); |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2362 | } |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2363 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2364 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2365 | static void |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2366 | rc4_reset(PurpleCipherContext *context, void *extra) { |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2367 | struct RC4Context *rc4_ctx; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2368 | guint i; |
|
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 | 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
|
2371 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2372 | g_return_if_fail(rc4_ctx); |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2373 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2374 | for(i = 0; i < 256; i++) |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2375 | rc4_ctx->state[i] = i; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2376 | rc4_ctx->x = 0; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2377 | rc4_ctx->y = 0; |
|
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 | /* default is 5 bytes (40bit key) */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2380 | rc4_ctx->key_len = 5; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2381 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2382 | } |
|
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 | static void |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2385 | rc4_uninit(PurpleCipherContext *context) { |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2386 | struct RC4Context *rc4_ctx; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2387 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2388 | 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
|
2389 | 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
|
2390 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2391 | g_free(rc4_ctx); |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2392 | rc4_ctx = NULL; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2393 | } |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2394 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2395 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2396 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2397 | static void |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2398 | 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
|
2399 | struct RC4Context *ctx; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2400 | guchar *state; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2401 | guchar temp_swap; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2402 | guchar x, y; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2403 | guint i; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2404 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2405 | 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
|
2406 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2407 | x = 0; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2408 | y = 0; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2409 | state = &ctx->state[0]; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2410 | for(i = 0; i < 256; i++) |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2411 | { |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2412 | 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
|
2413 | temp_swap = state[i]; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2414 | state[i] = state[y]; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2415 | state[y] = temp_swap; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2416 | x = (x + 1) % ctx->key_len; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2417 | } |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2418 | } |
|
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 | static void |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2421 | 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
|
2422 | struct RC4Context *ctx; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2423 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2424 | 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
|
2425 | |
|
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
|
2426 | 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
|
2427 | 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
|
2428 | } |
|
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 | |
|
25888
d0fdd378a635
Remove trailing whitespace
Mark Doliner <markdoliner@pidgin.im>
parents:
25859
diff
changeset
|
2431 | static size_t |
|
17053
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2432 | rc4_get_key_size (PurpleCipherContext *context) |
|
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 | struct RC4Context *ctx; |
|
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(context, -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 | 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
|
2439 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2440 | 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
|
2441 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2442 | return ctx->key_len; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2443 | } |
|
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 | static void * |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2446 | 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
|
2447 | struct RC4Context *ctx; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2448 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2449 | 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
|
2450 | |
|
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
|
2451 | 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
|
2452 | 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
|
2453 | } |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2454 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2455 | return NULL; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2456 | } |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2457 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2458 | static gint |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2459 | 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
|
2460 | 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
|
2461 | struct RC4Context *ctx; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2462 | guchar temp_swap; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2463 | guchar x, y, z; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2464 | guchar *state; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2465 | guint i; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2466 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2467 | 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
|
2468 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2469 | x = ctx->x; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2470 | y = ctx->y; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2471 | state = &ctx->state[0]; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2472 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2473 | for(i = 0; i < len; i++) |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2474 | { |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2475 | x = (x + 1) % 256; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2476 | y = (state[x] + y) % 256; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2477 | temp_swap = state[x]; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2478 | state[x] = state[y]; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2479 | state[y] = temp_swap; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2480 | z = state[x] + (state[y]) % 256; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2481 | output[i] = data[i] ^ state[z]; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2482 | } |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2483 | ctx->x = x; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2484 | ctx->y = y; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2485 | if(outlen) |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2486 | *outlen = len; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2487 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2488 | return 0; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2489 | } |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2490 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2491 | static PurpleCipherOps RC4Ops = { |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2492 | rc4_set_opt, /* Set Option */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2493 | rc4_get_opt, /* Get Option */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2494 | rc4_init, /* init */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2495 | rc4_reset, /* reset */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2496 | rc4_uninit, /* uninit */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2497 | NULL, /* set iv */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2498 | NULL, /* append */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2499 | NULL, /* digest */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2500 | rc4_encrypt, /* encrypt */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2501 | NULL, /* decrypt */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2502 | NULL, /* set salt */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2503 | NULL, /* get salt size */ |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2504 | 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
|
2505 | 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
|
2506 | 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
|
2507 | 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
|
2508 | NULL, /* get block size */ |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
2509 | NULL /* set key with len */ |
|
17053
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2510 | }; |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2511 | |
|
564ffcd0fe40
RC4 support to libpurple's cipher.c.
Jeff Connelly <jeff2@soc.pidgin.im>
parents:
16747
diff
changeset
|
2512 | /******************************************************************************* |
| 10684 | 2513 | * Structs |
| 2514 | ******************************************************************************/ | |
| 15884 | 2515 | struct _PurpleCipher { |
|
17435
a42f7e095cfd
- Add documentation for the internal CipherContext struct
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17155
diff
changeset
|
2516 | gchar *name; /**< Internal name - used for searching */ |
|
a42f7e095cfd
- Add documentation for the internal CipherContext struct
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17155
diff
changeset
|
2517 | PurpleCipherOps *ops; /**< Operations supported by this cipher */ |
|
a42f7e095cfd
- Add documentation for the internal CipherContext struct
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17155
diff
changeset
|
2518 | guint ref; /**< Reference count */ |
| 10684 | 2519 | }; |
| 2520 | ||
| 15884 | 2521 | struct _PurpleCipherContext { |
|
17435
a42f7e095cfd
- Add documentation for the internal CipherContext struct
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17155
diff
changeset
|
2522 | PurpleCipher *cipher; /**< Cipher this context is under */ |
|
a42f7e095cfd
- Add documentation for the internal CipherContext struct
William Ehlhardt <williamehlhardt@gmail.com>
parents:
17155
diff
changeset
|
2523 | gpointer data; /**< Internal cipher state data */ |
| 10684 | 2524 | }; |
| 2525 | ||
| 2526 | /****************************************************************************** | |
| 2527 | * Globals | |
| 2528 | *****************************************************************************/ | |
| 2529 | static GList *ciphers = NULL; | |
| 2530 | ||
| 2531 | /****************************************************************************** | |
| 15884 | 2532 | * PurpleCipher API |
| 10684 | 2533 | *****************************************************************************/ |
| 2534 | const gchar * | |
| 15884 | 2535 | purple_cipher_get_name(PurpleCipher *cipher) { |
| 10684 | 2536 | g_return_val_if_fail(cipher, NULL); |
| 2537 | ||
| 2538 | return cipher->name; | |
| 2539 | } | |
| 2540 | ||
| 2541 | guint | |
| 15884 | 2542 | purple_cipher_get_capabilities(PurpleCipher *cipher) { |
| 2543 | PurpleCipherOps *ops = NULL; | |
| 10684 | 2544 | guint caps = 0; |
| 2545 | ||
| 2546 | g_return_val_if_fail(cipher, 0); | |
| 2547 | ||
| 2548 | ops = cipher->ops; | |
| 2549 | g_return_val_if_fail(ops, 0); | |
| 2550 | ||
| 2551 | if(ops->set_option) | |
| 15884 | 2552 | caps |= PURPLE_CIPHER_CAPS_SET_OPT; |
| 10684 | 2553 | if(ops->get_option) |
| 15884 | 2554 | caps |= PURPLE_CIPHER_CAPS_GET_OPT; |
| 10684 | 2555 | if(ops->init) |
| 15884 | 2556 | caps |= PURPLE_CIPHER_CAPS_INIT; |
| 10684 | 2557 | if(ops->reset) |
| 15884 | 2558 | caps |= PURPLE_CIPHER_CAPS_RESET; |
| 10684 | 2559 | if(ops->uninit) |
| 15884 | 2560 | caps |= PURPLE_CIPHER_CAPS_UNINIT; |
| 10684 | 2561 | if(ops->set_iv) |
| 15884 | 2562 | caps |= PURPLE_CIPHER_CAPS_SET_IV; |
| 10684 | 2563 | if(ops->append) |
| 15884 | 2564 | caps |= PURPLE_CIPHER_CAPS_APPEND; |
| 10684 | 2565 | if(ops->digest) |
| 15884 | 2566 | caps |= PURPLE_CIPHER_CAPS_DIGEST; |
| 10684 | 2567 | if(ops->encrypt) |
| 15884 | 2568 | caps |= PURPLE_CIPHER_CAPS_ENCRYPT; |
| 10684 | 2569 | if(ops->decrypt) |
| 15884 | 2570 | caps |= PURPLE_CIPHER_CAPS_DECRYPT; |
| 10684 | 2571 | if(ops->set_salt) |
| 15884 | 2572 | caps |= PURPLE_CIPHER_CAPS_SET_SALT; |
| 10684 | 2573 | if(ops->get_salt_size) |
| 15884 | 2574 | caps |= PURPLE_CIPHER_CAPS_GET_SALT_SIZE; |
| 10684 | 2575 | if(ops->set_key) |
| 15884 | 2576 | caps |= PURPLE_CIPHER_CAPS_SET_KEY; |
| 10684 | 2577 | if(ops->get_key_size) |
| 15884 | 2578 | 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
|
2579 | 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
|
2580 | 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
|
2581 | 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
|
2582 | 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
|
2583 | 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
|
2584 | 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
|
2585 | 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
|
2586 | caps |= PURPLE_CIPHER_CAPS_SET_KEY_WITH_LEN; |
| 10684 | 2587 | |
| 2588 | return caps; | |
| 2589 | } | |
| 2590 | ||
| 10687 | 2591 | gboolean |
| 15884 | 2592 | purple_cipher_digest_region(const gchar *name, const guchar *data, |
| 10687 | 2593 | size_t data_len, size_t in_len, |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
2594 | guchar digest[], size_t *out_len) |
| 10684 | 2595 | { |
| 15884 | 2596 | PurpleCipher *cipher; |
| 2597 | PurpleCipherContext *context; | |
| 10687 | 2598 | gboolean ret = FALSE; |
| 10684 | 2599 | |
| 10687 | 2600 | g_return_val_if_fail(name, FALSE); |
| 2601 | g_return_val_if_fail(data, FALSE); | |
| 10684 | 2602 | |
| 15884 | 2603 | cipher = purple_ciphers_find_cipher(name); |
| 10684 | 2604 | |
| 10687 | 2605 | g_return_val_if_fail(cipher, FALSE); |
| 10684 | 2606 | |
| 2607 | 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
|
2608 | purple_debug_warning("cipher", "purple_cipher_region failed: " |
| 10684 | 2609 | "the %s cipher does not support appending and or " |
| 2610 | "digesting.", cipher->name); | |
| 10687 | 2611 | return FALSE; |
| 10684 | 2612 | } |
| 2613 | ||
| 15884 | 2614 | context = purple_cipher_context_new(cipher, NULL); |
| 2615 | purple_cipher_context_append(context, data, data_len); | |
| 2616 | ret = purple_cipher_context_digest(context, in_len, digest, out_len); | |
| 2617 | purple_cipher_context_destroy(context); | |
| 10687 | 2618 | |
| 2619 | return ret; | |
| 10684 | 2620 | } |
| 2621 | ||
| 2622 | /****************************************************************************** | |
| 15884 | 2623 | * PurpleCiphers API |
| 10684 | 2624 | *****************************************************************************/ |
| 15884 | 2625 | PurpleCipher * |
| 2626 | purple_ciphers_find_cipher(const gchar *name) { | |
| 2627 | PurpleCipher *cipher; | |
| 10684 | 2628 | GList *l; |
| 2629 | ||
| 2630 | g_return_val_if_fail(name, NULL); | |
| 2631 | ||
| 2632 | for(l = ciphers; l; l = l->next) { | |
| 15884 | 2633 | cipher = PURPLE_CIPHER(l->data); |
| 10684 | 2634 | |
| 2635 | if(!g_ascii_strcasecmp(cipher->name, name)) | |
| 2636 | return cipher; | |
| 2637 | } | |
| 2638 | ||
| 2639 | return NULL; | |
| 2640 | } | |
| 2641 | ||
| 15884 | 2642 | PurpleCipher * |
| 2643 | purple_ciphers_register_cipher(const gchar *name, PurpleCipherOps *ops) { | |
| 2644 | PurpleCipher *cipher = NULL; | |
| 10684 | 2645 | |
| 2646 | g_return_val_if_fail(name, NULL); | |
| 2647 | g_return_val_if_fail(ops, NULL); | |
| 15884 | 2648 | g_return_val_if_fail(!purple_ciphers_find_cipher(name), NULL); |
| 10684 | 2649 | |
| 15884 | 2650 | cipher = g_new0(PurpleCipher, 1); |
| 2651 | PURPLE_DBUS_REGISTER_POINTER(cipher, PurpleCipher); | |
| 10684 | 2652 | |
| 2653 | cipher->name = g_strdup(name); | |
| 2654 | cipher->ops = ops; | |
| 2655 | ||
| 2656 | ciphers = g_list_append(ciphers, cipher); | |
| 2657 | ||
| 15884 | 2658 | purple_signal_emit(purple_ciphers_get_handle(), "cipher-added", cipher); |
| 10684 | 2659 | |
| 2660 | return cipher; | |
| 2661 | } | |
| 2662 | ||
| 2663 | gboolean | |
| 15884 | 2664 | purple_ciphers_unregister_cipher(PurpleCipher *cipher) { |
| 10684 | 2665 | g_return_val_if_fail(cipher, FALSE); |
| 2666 | g_return_val_if_fail(cipher->ref == 0, FALSE); | |
| 2667 | ||
| 15884 | 2668 | purple_signal_emit(purple_ciphers_get_handle(), "cipher-removed", cipher); |
| 10684 | 2669 | |
| 2670 | ciphers = g_list_remove(ciphers, cipher); | |
| 2671 | ||
| 2672 | g_free(cipher->name); | |
|
13760
09669e542e2f
[gaim-migrate @ 16169]
Mark Doliner <markdoliner@pidgin.im>
parents:
13699
diff
changeset
|
2673 | |
| 15884 | 2674 | PURPLE_DBUS_UNREGISTER_POINTER(cipher); |
| 10684 | 2675 | g_free(cipher); |
| 2676 | ||
| 2677 | return TRUE; | |
| 2678 | } | |
| 2679 | ||
| 2680 | GList * | |
| 15884 | 2681 | purple_ciphers_get_ciphers() { |
| 10684 | 2682 | return ciphers; |
| 2683 | } | |
| 2684 | ||
| 2685 | /****************************************************************************** | |
| 15884 | 2686 | * PurpleCipher Subsystem API |
| 10684 | 2687 | *****************************************************************************/ |
| 2688 | gpointer | |
| 15884 | 2689 | purple_ciphers_get_handle() { |
| 10684 | 2690 | static gint handle; |
| 2691 | ||
| 2692 | return &handle; | |
| 2693 | } | |
| 2694 | ||
| 2695 | void | |
| 15884 | 2696 | purple_ciphers_init() { |
| 10684 | 2697 | gpointer handle; |
| 2698 | ||
| 15884 | 2699 | handle = purple_ciphers_get_handle(); |
| 10684 | 2700 | |
| 15884 | 2701 | purple_signal_register(handle, "cipher-added", |
| 2702 | purple_marshal_VOID__POINTER, NULL, 1, | |
| 2703 | purple_value_new(PURPLE_TYPE_SUBTYPE, | |
| 2704 | PURPLE_SUBTYPE_CIPHER)); | |
| 2705 | purple_signal_register(handle, "cipher-removed", | |
| 2706 | purple_marshal_VOID__POINTER, NULL, 1, | |
| 2707 | purple_value_new(PURPLE_TYPE_SUBTYPE, | |
| 2708 | PURPLE_SUBTYPE_CIPHER)); | |
| 10684 | 2709 | |
| 15884 | 2710 | purple_ciphers_register_cipher("md5", &MD5Ops); |
| 2711 | 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
|
2712 | purple_ciphers_register_cipher("sha256", &SHA256Ops); |
| 15884 | 2713 | 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
|
2714 | purple_ciphers_register_cipher("hmac", &HMACOps); |
| 15884 | 2715 | 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
|
2716 | 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
|
2717 | purple_ciphers_register_cipher("rc4", &RC4Ops); |
| 10684 | 2718 | } |
| 2719 | ||
| 2720 | void | |
| 15884 | 2721 | purple_ciphers_uninit() { |
| 2722 | PurpleCipher *cipher; | |
| 10684 | 2723 | GList *l, *ll; |
| 2724 | ||
| 2725 | for(l = ciphers; l; l = ll) { | |
| 2726 | ll = l->next; | |
| 2727 | ||
| 15884 | 2728 | cipher = PURPLE_CIPHER(l->data); |
| 2729 | purple_ciphers_unregister_cipher(cipher); | |
| 10684 | 2730 | } |
| 2731 | ||
| 2732 | g_list_free(ciphers); | |
| 2733 | ||
| 15884 | 2734 | purple_signals_unregister_by_instance(purple_ciphers_get_handle()); |
| 10684 | 2735 | } |
| 2736 | /****************************************************************************** | |
| 15884 | 2737 | * PurpleCipherContext API |
| 10684 | 2738 | *****************************************************************************/ |
| 2739 | void | |
| 15884 | 2740 | purple_cipher_context_set_option(PurpleCipherContext *context, const gchar *name, |
| 10684 | 2741 | gpointer value) |
| 2742 | { | |
| 15884 | 2743 | PurpleCipher *cipher = NULL; |
| 10684 | 2744 | |
| 2745 | g_return_if_fail(context); | |
| 2746 | g_return_if_fail(name); | |
| 2747 | ||
| 2748 | cipher = context->cipher; | |
| 2749 | g_return_if_fail(cipher); | |
| 2750 | ||
| 2751 | if(cipher->ops && cipher->ops->set_option) | |
| 2752 | cipher->ops->set_option(context, name, value); | |
| 2753 | 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
|
2754 | purple_debug_warning("cipher", "the %s cipher does not support the " |
| 10684 | 2755 | "set_option operation\n", cipher->name); |
| 2756 | } | |
| 2757 | ||
| 2758 | gpointer | |
| 15884 | 2759 | purple_cipher_context_get_option(PurpleCipherContext *context, const gchar *name) { |
| 2760 | PurpleCipher *cipher = NULL; | |
| 10684 | 2761 | |
| 2762 | g_return_val_if_fail(context, NULL); | |
| 2763 | g_return_val_if_fail(name, NULL); | |
| 2764 | ||
| 2765 | cipher = context->cipher; | |
| 2766 | g_return_val_if_fail(cipher, NULL); | |
| 2767 | ||
| 2768 | if(cipher->ops && cipher->ops->get_option) | |
| 2769 | return cipher->ops->get_option(context, name); | |
| 2770 | 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
|
2771 | purple_debug_warning("cipher", "the %s cipher does not support the " |
| 10684 | 2772 | "get_option operation\n", cipher->name); |
| 2773 | ||
| 2774 | return NULL; | |
| 2775 | } | |
| 2776 | } | |
| 2777 | ||
| 15884 | 2778 | PurpleCipherContext * |
| 2779 | purple_cipher_context_new(PurpleCipher *cipher, void *extra) { | |
| 2780 | PurpleCipherContext *context = NULL; | |
| 10684 | 2781 | |
| 2782 | g_return_val_if_fail(cipher, NULL); | |
| 2783 | ||
| 2784 | cipher->ref++; | |
| 2785 | ||
| 15884 | 2786 | context = g_new0(PurpleCipherContext, 1); |
| 10684 | 2787 | context->cipher = cipher; |
| 2788 | ||
| 2789 | if(cipher->ops->init) | |
| 2790 | cipher->ops->init(context, extra); | |
| 2791 | ||
| 2792 | return context; | |
| 2793 | } | |
| 2794 | ||
| 15884 | 2795 | PurpleCipherContext * |
| 2796 | purple_cipher_context_new_by_name(const gchar *name, void *extra) { | |
| 2797 | PurpleCipher *cipher; | |
| 10684 | 2798 | |
| 2799 | g_return_val_if_fail(name, NULL); | |
| 2800 | ||
| 15884 | 2801 | cipher = purple_ciphers_find_cipher(name); |
| 10684 | 2802 | |
| 2803 | g_return_val_if_fail(cipher, NULL); | |
| 2804 | ||
| 15884 | 2805 | return purple_cipher_context_new(cipher, extra); |
| 10684 | 2806 | } |
| 2807 | ||
| 2808 | void | |
| 15884 | 2809 | purple_cipher_context_reset(PurpleCipherContext *context, void *extra) { |
| 2810 | PurpleCipher *cipher = NULL; | |
| 10684 | 2811 | |
| 2812 | g_return_if_fail(context); | |
| 2813 | ||
| 2814 | cipher = context->cipher; | |
| 2815 | g_return_if_fail(cipher); | |
| 2816 | ||
| 2817 | if(cipher->ops && cipher->ops->reset) | |
| 2818 | context->cipher->ops->reset(context, extra); | |
| 2819 | } | |
| 2820 | ||
| 2821 | void | |
| 15884 | 2822 | purple_cipher_context_destroy(PurpleCipherContext *context) { |
| 2823 | PurpleCipher *cipher = NULL; | |
| 10684 | 2824 | |
| 2825 | g_return_if_fail(context); | |
| 2826 | ||
| 2827 | cipher = context->cipher; | |
| 2828 | g_return_if_fail(cipher); | |
| 2829 | ||
| 2830 | cipher->ref--; | |
| 2831 | ||
| 2832 | if(cipher->ops && cipher->ops->uninit) | |
| 2833 | cipher->ops->uninit(context); | |
| 2834 | ||
| 2835 | memset(context, 0, sizeof(context)); | |
| 2836 | g_free(context); | |
| 2837 | context = NULL; | |
| 2838 | } | |
| 2839 | ||
| 2840 | void | |
| 15884 | 2841 | purple_cipher_context_set_iv(PurpleCipherContext *context, guchar *iv, size_t len) |
| 10684 | 2842 | { |
| 15884 | 2843 | PurpleCipher *cipher = NULL; |
| 10684 | 2844 | |
| 2845 | g_return_if_fail(context); | |
| 2846 | g_return_if_fail(iv); | |
| 2847 | ||
| 2848 | cipher = context->cipher; | |
| 2849 | g_return_if_fail(cipher); | |
| 2850 | ||
| 2851 | if(cipher->ops && cipher->ops->set_iv) | |
| 2852 | cipher->ops->set_iv(context, iv, len); | |
| 2853 | 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
|
2854 | purple_debug_warning("cipher", "the %s cipher does not support the set" |
| 10684 | 2855 | "initialization vector operation\n", cipher->name); |
| 2856 | } | |
| 2857 | ||
| 2858 | void | |
| 15884 | 2859 | purple_cipher_context_append(PurpleCipherContext *context, const guchar *data, |
| 10684 | 2860 | size_t len) |
| 2861 | { | |
| 15884 | 2862 | PurpleCipher *cipher = NULL; |
| 10684 | 2863 | |
| 2864 | g_return_if_fail(context); | |
| 2865 | ||
| 2866 | cipher = context->cipher; | |
| 2867 | g_return_if_fail(cipher); | |
| 2868 | ||
| 2869 | if(cipher->ops && cipher->ops->append) | |
| 2870 | cipher->ops->append(context, data, len); | |
| 2871 | 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
|
2872 | purple_debug_warning("cipher", "the %s cipher does not support the append " |
| 10684 | 2873 | "operation\n", cipher->name); |
| 2874 | } | |
| 2875 | ||
| 2876 | gboolean | |
| 15884 | 2877 | purple_cipher_context_digest(PurpleCipherContext *context, size_t in_len, |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
2878 | guchar digest[], size_t *out_len) |
| 10684 | 2879 | { |
| 15884 | 2880 | PurpleCipher *cipher = NULL; |
| 10684 | 2881 | |
| 2882 | g_return_val_if_fail(context, FALSE); | |
| 2883 | ||
| 2884 | cipher = context->cipher; | |
| 2885 | ||
| 2886 | if(cipher->ops && cipher->ops->digest) | |
| 10687 | 2887 | return cipher->ops->digest(context, in_len, digest, out_len); |
| 10684 | 2888 | 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
|
2889 | purple_debug_warning("cipher", "the %s cipher does not support the digest " |
| 10684 | 2890 | "operation\n", cipher->name); |
| 2891 | return FALSE; | |
| 2892 | } | |
| 2893 | } | |
| 2894 | ||
| 2895 | gboolean | |
| 15884 | 2896 | purple_cipher_context_digest_to_str(PurpleCipherContext *context, size_t in_len, |
| 10687 | 2897 | gchar digest_s[], size_t *out_len) |
| 10684 | 2898 | { |
| 10687 | 2899 | /* 8k is a bit excessive, will tweak later. */ |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
2900 | guchar digest[BUF_LEN * 4]; |
| 10684 | 2901 | gint n = 0; |
| 2902 | size_t dlen = 0; | |
| 2903 | ||
| 2904 | g_return_val_if_fail(context, FALSE); | |
| 2905 | g_return_val_if_fail(digest_s, FALSE); | |
| 2906 | ||
| 15884 | 2907 | if(!purple_cipher_context_digest(context, sizeof(digest), digest, &dlen)) |
| 10684 | 2908 | return FALSE; |
| 2909 | ||
|
12388
3a25d96abdaf
[gaim-migrate @ 14694]
Richard Laager <rlaager@pidgin.im>
parents:
12382
diff
changeset
|
2910 | /* 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
|
2911 | if(in_len <= dlen * 2) |
| 10687 | 2912 | return FALSE; |
| 10684 | 2913 | |
| 2914 | for(n = 0; n < dlen; n++) | |
| 2915 | sprintf(digest_s + (n * 2), "%02x", digest[n]); | |
| 2916 | ||
| 2917 | digest_s[n * 2] = '\0'; | |
| 2918 | ||
| 10687 | 2919 | if(out_len) |
| 2920 | *out_len = dlen * 2; | |
| 2921 | ||
| 10684 | 2922 | return TRUE; |
| 2923 | } | |
| 2924 | ||
| 2925 | gint | |
| 15884 | 2926 | purple_cipher_context_encrypt(PurpleCipherContext *context, const guchar data[], |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
2927 | size_t len, guchar output[], size_t *outlen) |
| 10684 | 2928 | { |
| 15884 | 2929 | PurpleCipher *cipher = NULL; |
| 10684 | 2930 | |
| 2931 | g_return_val_if_fail(context, -1); | |
| 2932 | ||
| 2933 | cipher = context->cipher; | |
| 2934 | g_return_val_if_fail(cipher, -1); | |
| 2935 | ||
| 2936 | if(cipher->ops && cipher->ops->encrypt) | |
| 2937 | return cipher->ops->encrypt(context, data, len, output, outlen); | |
| 2938 | 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
|
2939 | purple_debug_warning("cipher", "the %s cipher does not support the encrypt" |
| 10684 | 2940 | "operation\n", cipher->name); |
| 2941 | ||
| 2942 | if(outlen) | |
| 2943 | *outlen = -1; | |
| 2944 | ||
| 2945 | return -1; | |
| 2946 | } | |
| 2947 | } | |
| 2948 | ||
| 2949 | gint | |
| 15884 | 2950 | purple_cipher_context_decrypt(PurpleCipherContext *context, const guchar data[], |
|
11183
be87fe695c93
[gaim-migrate @ 13295]
Mark Doliner <markdoliner@pidgin.im>
parents:
11143
diff
changeset
|
2951 | size_t len, guchar output[], size_t *outlen) |
| 10684 | 2952 | { |
| 15884 | 2953 | PurpleCipher *cipher = NULL; |
| 10684 | 2954 | |
| 2955 | g_return_val_if_fail(context, -1); | |
| 2956 | ||
| 2957 | cipher = context->cipher; | |
| 2958 | g_return_val_if_fail(cipher, -1); | |
| 2959 | ||
| 2960 | if(cipher->ops && cipher->ops->decrypt) | |
| 2961 | return cipher->ops->decrypt(context, data, len, output, outlen); | |
| 2962 | 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
|
2963 | purple_debug_warning("cipher", "the %s cipher does not support the decrypt" |
| 10684 | 2964 | "operation\n", cipher->name); |
| 2965 | ||
| 2966 | if(outlen) | |
| 2967 | *outlen = -1; | |
| 2968 | ||
| 2969 | return -1; | |
| 2970 | } | |
| 2971 | } | |
| 2972 | ||
| 2973 | void | |
| 15884 | 2974 | purple_cipher_context_set_salt(PurpleCipherContext *context, guchar *salt) { |
| 2975 | PurpleCipher *cipher = NULL; | |
| 10684 | 2976 | |
| 2977 | g_return_if_fail(context); | |
| 2978 | ||
| 2979 | cipher = context->cipher; | |
| 2980 | g_return_if_fail(cipher); | |
| 2981 | ||
| 2982 | if(cipher->ops && cipher->ops->set_salt) | |
| 2983 | cipher->ops->set_salt(context, salt); | |
| 2984 | 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
|
2985 | purple_debug_warning("cipher", "the %s cipher does not support the " |
| 10684 | 2986 | "set_salt operation\n", cipher->name); |
| 2987 | } | |
| 2988 | ||
| 2989 | size_t | |
| 15884 | 2990 | purple_cipher_context_get_salt_size(PurpleCipherContext *context) { |
| 2991 | PurpleCipher *cipher = NULL; | |
| 10684 | 2992 | |
| 2993 | g_return_val_if_fail(context, -1); | |
| 2994 | ||
| 2995 | cipher = context->cipher; | |
| 2996 | g_return_val_if_fail(cipher, -1); | |
| 2997 | ||
| 2998 | if(cipher->ops && cipher->ops->get_salt_size) | |
| 2999 | return cipher->ops->get_salt_size(context); | |
| 3000 | 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
|
3001 | purple_debug_warning("cipher", "the %s cipher does not support the " |
| 10684 | 3002 | "get_salt_size operation\n", cipher->name); |
| 3003 | ||
| 3004 | return -1; | |
| 3005 | } | |
| 3006 | } | |
| 3007 | ||
| 3008 | void | |
| 15884 | 3009 | purple_cipher_context_set_key(PurpleCipherContext *context, const guchar *key) { |
| 3010 | PurpleCipher *cipher = NULL; | |
| 10684 | 3011 | |
| 3012 | g_return_if_fail(context); | |
| 3013 | ||
| 3014 | cipher = context->cipher; | |
| 3015 | g_return_if_fail(cipher); | |
| 3016 | ||
| 3017 | if(cipher->ops && cipher->ops->set_key) | |
| 3018 | cipher->ops->set_key(context, key); | |
| 3019 | 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
|
3020 | purple_debug_warning("cipher", "the %s cipher does not support the " |
| 10684 | 3021 | "set_key operation\n", cipher->name); |
| 3022 | } | |
| 3023 | ||
| 3024 | size_t | |
| 15884 | 3025 | purple_cipher_context_get_key_size(PurpleCipherContext *context) { |
| 3026 | PurpleCipher *cipher = NULL; | |
| 10684 | 3027 | |
| 3028 | g_return_val_if_fail(context, -1); | |
| 3029 | ||
| 3030 | cipher = context->cipher; | |
| 3031 | g_return_val_if_fail(cipher, -1); | |
| 3032 | ||
| 3033 | if(cipher->ops && cipher->ops->get_key_size) | |
| 3034 | return cipher->ops->get_key_size(context); | |
| 3035 | 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
|
3036 | purple_debug_warning("cipher", "the %s cipher does not support the " |
| 10684 | 3037 | "get_key_size operation\n", cipher->name); |
| 3038 | ||
| 3039 | return -1; | |
| 3040 | } | |
| 3041 | } | |
| 3042 | ||
| 3043 | void | |
|
22024
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3044 | 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
|
3045 | PurpleCipherBatchMode mode) |
|
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 | PurpleCipher *cipher = NULL; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3048 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3049 | 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
|
3050 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3051 | cipher = context->cipher; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3052 | 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
|
3053 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3054 | 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
|
3055 | 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
|
3056 | 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
|
3057 | 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
|
3058 | "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
|
3059 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3060 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3061 | PurpleCipherBatchMode |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3062 | 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
|
3063 | { |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3064 | PurpleCipher *cipher = NULL; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3065 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3066 | 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
|
3067 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3068 | cipher = context->cipher; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3069 | 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
|
3070 | |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3071 | 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
|
3072 | 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
|
3073 | 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
|
3074 | 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
|
3075 | "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
|
3076 | return -1; |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3077 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3078 | } |
|
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3079 | |
|
22025
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3080 | size_t |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3081 | 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
|
3082 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3083 | PurpleCipher *cipher = NULL; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3084 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3085 | 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
|
3086 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3087 | cipher = context->cipher; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3088 | 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
|
3089 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3090 | 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
|
3091 | 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
|
3092 | 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
|
3093 | 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
|
3094 | "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
|
3095 | return -1; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3096 | } |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3097 | } |
|
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 | void |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3100 | 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
|
3101 | 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
|
3102 | { |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3103 | PurpleCipher *cipher = NULL; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3104 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3105 | 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
|
3106 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3107 | cipher = context->cipher; |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3108 | 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
|
3109 | |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3110 | 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
|
3111 | 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
|
3112 | 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
|
3113 | 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
|
3114 | "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
|
3115 | } |
|
23756775175d
HMAC digest support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
22024
diff
changeset
|
3116 | |
|
22024
3fd5e4fff1be
Triple DES cipher support from Elliott Sales de Andrade
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
21091
diff
changeset
|
3117 | void |
| 15884 | 3118 | purple_cipher_context_set_data(PurpleCipherContext *context, gpointer data) { |
| 10684 | 3119 | g_return_if_fail(context); |
| 3120 | ||
| 3121 | context->data = data; | |
| 3122 | } | |
| 3123 | ||
| 3124 | gpointer | |
| 15884 | 3125 | purple_cipher_context_get_data(PurpleCipherContext *context) { |
| 10684 | 3126 | g_return_val_if_fail(context, NULL); |
| 3127 | ||
| 3128 | return context->data; | |
| 3129 | } | |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3130 | |
| 15884 | 3131 | gchar *purple_cipher_http_digest_calculate_session_key( |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3132 | const gchar *algorithm, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3133 | const gchar *username, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3134 | const gchar *realm, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3135 | const gchar *password, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3136 | const gchar *nonce, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3137 | const gchar *client_nonce) |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3138 | { |
| 15884 | 3139 | PurpleCipher *cipher; |
| 3140 | PurpleCipherContext *context; | |
|
12388
3a25d96abdaf
[gaim-migrate @ 14694]
Richard Laager <rlaager@pidgin.im>
parents:
12382
diff
changeset
|
3141 | gchar hash[33]; /* We only support MD5. */ |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3142 | |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3143 | g_return_val_if_fail(username != NULL, NULL); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3144 | g_return_val_if_fail(realm != NULL, NULL); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3145 | g_return_val_if_fail(password != NULL, NULL); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3146 | g_return_val_if_fail(nonce != NULL, NULL); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3147 | |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3148 | /* Check for a supported algorithm. */ |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3149 | g_return_val_if_fail(algorithm == NULL || |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3150 | *algorithm == '\0' || |
|
17155
143ff2796376
Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents:
17065
diff
changeset
|
3151 | g_ascii_strcasecmp(algorithm, "MD5") || |
|
143ff2796376
Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents:
17065
diff
changeset
|
3152 | g_ascii_strcasecmp(algorithm, "MD5-sess"), NULL); |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3153 | |
| 15884 | 3154 | cipher = purple_ciphers_find_cipher("md5"); |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3155 | g_return_val_if_fail(cipher != NULL, NULL); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3156 | |
| 15884 | 3157 | context = purple_cipher_context_new(cipher, NULL); |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3158 | |
| 15884 | 3159 | purple_cipher_context_append(context, (guchar *)username, strlen(username)); |
| 3160 | purple_cipher_context_append(context, (guchar *)":", 1); | |
| 3161 | purple_cipher_context_append(context, (guchar *)realm, strlen(realm)); | |
| 3162 | purple_cipher_context_append(context, (guchar *)":", 1); | |
| 3163 | purple_cipher_context_append(context, (guchar *)password, strlen(password)); | |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3164 | |
|
17155
143ff2796376
Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents:
17065
diff
changeset
|
3165 | if (algorithm != NULL && !g_ascii_strcasecmp(algorithm, "MD5-sess")) |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3166 | { |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3167 | guchar digest[16]; |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3168 | |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3169 | if (client_nonce == NULL) |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3170 | { |
| 15884 | 3171 | 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
|
3172 | 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
|
3173 | return NULL; |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3174 | } |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3175 | |
| 15884 | 3176 | purple_cipher_context_digest(context, sizeof(digest), digest, NULL); |
| 3177 | purple_cipher_context_destroy(context); | |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3178 | |
| 15884 | 3179 | context = purple_cipher_context_new(cipher, NULL); |
| 3180 | purple_cipher_context_append(context, digest, sizeof(digest)); | |
| 3181 | purple_cipher_context_append(context, (guchar *)":", 1); | |
| 3182 | purple_cipher_context_append(context, (guchar *)nonce, strlen(nonce)); | |
| 3183 | purple_cipher_context_append(context, (guchar *)":", 1); | |
| 3184 | 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
|
3185 | } |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3186 | |
| 15884 | 3187 | purple_cipher_context_digest_to_str(context, sizeof(hash), hash, NULL); |
| 3188 | purple_cipher_context_destroy(context); | |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3189 | |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3190 | return g_strdup(hash); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3191 | } |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3192 | |
| 15884 | 3193 | gchar *purple_cipher_http_digest_calculate_response( |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3194 | const gchar *algorithm, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3195 | const gchar *method, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3196 | const gchar *digest_uri, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3197 | const gchar *qop, |
|
12389
7196ba664097
[gaim-migrate @ 14695]
Richard Laager <rlaager@pidgin.im>
parents:
12388
diff
changeset
|
3198 | const gchar *entity, |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3199 | const gchar *nonce, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3200 | const gchar *nonce_count, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3201 | const gchar *client_nonce, |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3202 | const gchar *session_key) |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3203 | { |
| 15884 | 3204 | PurpleCipher *cipher; |
| 3205 | PurpleCipherContext *context; | |
|
12388
3a25d96abdaf
[gaim-migrate @ 14694]
Richard Laager <rlaager@pidgin.im>
parents:
12382
diff
changeset
|
3206 | static gchar hash2[33]; /* We only support MD5. */ |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3207 | |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3208 | g_return_val_if_fail(method != NULL, NULL); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3209 | g_return_val_if_fail(digest_uri != NULL, NULL); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3210 | g_return_val_if_fail(nonce != NULL, NULL); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3211 | g_return_val_if_fail(session_key != NULL, NULL); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3212 | |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3213 | /* Check for a supported algorithm. */ |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3214 | g_return_val_if_fail(algorithm == NULL || |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3215 | *algorithm == '\0' || |
|
17155
143ff2796376
Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents:
17065
diff
changeset
|
3216 | g_ascii_strcasecmp(algorithm, "MD5") || |
|
143ff2796376
Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents:
17065
diff
changeset
|
3217 | g_ascii_strcasecmp(algorithm, "MD5-sess"), NULL); |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3218 | |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3219 | /* Check for a supported "quality of protection". */ |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3220 | g_return_val_if_fail(qop == NULL || |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3221 | *qop == '\0' || |
|
17155
143ff2796376
Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents:
17065
diff
changeset
|
3222 | g_ascii_strcasecmp(qop, "auth") || |
|
143ff2796376
Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents:
17065
diff
changeset
|
3223 | g_ascii_strcasecmp(qop, "auth-int"), NULL); |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3224 | |
| 15884 | 3225 | cipher = purple_ciphers_find_cipher("md5"); |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3226 | g_return_val_if_fail(cipher != NULL, NULL); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3227 | |
| 15884 | 3228 | context = purple_cipher_context_new(cipher, NULL); |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3229 | |
| 15884 | 3230 | purple_cipher_context_append(context, (guchar *)method, strlen(method)); |
| 3231 | purple_cipher_context_append(context, (guchar *)":", 1); | |
| 3232 | 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
|
3233 | |
|
17155
143ff2796376
Replace strcasecmp() calls with glib equivalents.
Richard Laager <rlaager@pidgin.im>
parents:
17065
diff
changeset
|
3234 | if (qop != NULL && !g_ascii_strcasecmp(qop, "auth-int")) |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3235 | { |
| 15884 | 3236 | PurpleCipherContext *context2; |
|
12389
7196ba664097
[gaim-migrate @ 14695]
Richard Laager <rlaager@pidgin.im>
parents:
12388
diff
changeset
|
3237 | gchar entity_hash[33]; |
|
7196ba664097
[gaim-migrate @ 14695]
Richard Laager <rlaager@pidgin.im>
parents:
12388
diff
changeset
|
3238 | |
|
7196ba664097
[gaim-migrate @ 14695]
Richard Laager <rlaager@pidgin.im>
parents:
12388
diff
changeset
|
3239 | if (entity == NULL) |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3240 | { |
| 15884 | 3241 | 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
|
3242 | 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
|
3243 | return NULL; |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3244 | } |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3245 | |
| 15884 | 3246 | context2 = purple_cipher_context_new(cipher, NULL); |
| 3247 | purple_cipher_context_append(context2, (guchar *)entity, strlen(entity)); | |
| 3248 | purple_cipher_context_digest_to_str(context2, sizeof(entity_hash), entity_hash, NULL); | |
| 3249 | purple_cipher_context_destroy(context2); | |
|
12389
7196ba664097
[gaim-migrate @ 14695]
Richard Laager <rlaager@pidgin.im>
parents:
12388
diff
changeset
|
3250 | |
| 15884 | 3251 | purple_cipher_context_append(context, (guchar *)":", 1); |
| 3252 | 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
|
3253 | } |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3254 | |
| 15884 | 3255 | purple_cipher_context_digest_to_str(context, sizeof(hash2), hash2, NULL); |
| 3256 | purple_cipher_context_destroy(context); | |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3257 | |
| 15884 | 3258 | context = purple_cipher_context_new(cipher, NULL); |
| 3259 | purple_cipher_context_append(context, (guchar *)session_key, strlen(session_key)); | |
| 3260 | purple_cipher_context_append(context, (guchar *)":", 1); | |
| 3261 | purple_cipher_context_append(context, (guchar *)nonce, strlen(nonce)); | |
| 3262 | purple_cipher_context_append(context, (guchar *)":", 1); | |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3263 | |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3264 | if (qop != NULL && *qop != '\0') |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3265 | { |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3266 | if (nonce_count == NULL) |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3267 | { |
| 15884 | 3268 | 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
|
3269 | 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
|
3270 | return NULL; |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3271 | } |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3272 | |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3273 | if (client_nonce == NULL) |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3274 | { |
| 15884 | 3275 | 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
|
3276 | 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
|
3277 | return NULL; |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3278 | } |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3279 | |
| 15884 | 3280 | purple_cipher_context_append(context, (guchar *)nonce_count, strlen(nonce_count)); |
| 3281 | purple_cipher_context_append(context, (guchar *)":", 1); | |
| 3282 | purple_cipher_context_append(context, (guchar *)client_nonce, strlen(client_nonce)); | |
| 3283 | purple_cipher_context_append(context, (guchar *)":", 1); | |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3284 | |
| 15884 | 3285 | purple_cipher_context_append(context, (guchar *)qop, strlen(qop)); |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3286 | |
| 15884 | 3287 | purple_cipher_context_append(context, (guchar *)":", 1); |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3288 | } |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3289 | |
| 15884 | 3290 | purple_cipher_context_append(context, (guchar *)hash2, strlen(hash2)); |
| 3291 | purple_cipher_context_digest_to_str(context, sizeof(hash2), hash2, NULL); | |
| 3292 | purple_cipher_context_destroy(context); | |
|
12382
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3293 | |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3294 | return g_strdup(hash2); |
|
5ef67596b420
[gaim-migrate @ 14688]
Richard Laager <rlaager@pidgin.im>
parents:
11677
diff
changeset
|
3295 | } |