Mercurial > pidgin
annotate src/protocols/sametime/meanwhile/cipher.c @ 12468:6faefbebcd24
[gaim-migrate @ 14778]
SF Patch #1372898 from charkins
"This patch updates the unseen conversation api in
gtkconv to ensure consistancy and avoid code
duplication. The ...first_unseen() function is renamed
and expanded to return a list of conversations that
match the specified criteria. A max_count parameter is
used to allow this to short circuit early (using 1
gives old behavior). An additional flag was added to
allow this function to only consider hidden
conversations (used by the buddy list). The blist is
currently inconsistant in which conversations it loops
over for showing the menu tray icon, creating the
tooltip and the unseen menu. This patch fixes that.
The ...find_unseen_list() now handles contact-aware
conversations correctly as well (based on sadrul's
patches in #1362579 which are obsoleted by this patch).
I also included the fix from #1362579 which increments
unseen_count only when state>=UNSEEN_TEXT."
committer: Tailor Script <tailor@pidgin.im>
| author | Richard Laager <rlaager@wiktel.com> |
|---|---|
| date | Mon, 12 Dec 2005 18:59:29 +0000 |
| parents | a2ebf585d8c6 |
| children |
| rev | line source |
|---|---|
| 10969 | 1 |
| 2 /* | |
| 3 Meanwhile - Unofficial Lotus Sametime Community Client Library | |
| 4 Copyright (C) 2004 Christopher (siege) O'Brien | |
| 5 | |
| 6 This library is free software; you can redistribute it and/or | |
| 7 modify it under the terms of the GNU Library General Public | |
| 8 License as published by the Free Software Foundation; either | |
| 9 version 2 of the License, or (at your option) any later version. | |
| 10 | |
| 11 This library is distributed in the hope that it will be useful, | |
| 12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 Library General Public License for more details. | |
| 15 | |
| 16 You should have received a copy of the GNU Library General Public | |
| 17 License along with this library; if not, write to the Free | |
| 18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 19 */ | |
| 20 | |
| 21 #include <stdlib.h> | |
| 22 #include <time.h> | |
| 23 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
24 #include "mpi/mpi.h" |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
25 |
| 10969 | 26 #include "mw_channel.h" |
| 27 #include "mw_cipher.h" | |
| 28 #include "mw_debug.h" | |
| 29 #include "mw_session.h" | |
| 30 | |
| 31 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
32 struct mwMpi { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
33 mp_int i; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
34 }; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
35 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
36 |
| 10969 | 37 /** From RFC2268 */ |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
38 static guchar PT[] = { |
| 10969 | 39 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, |
| 40 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, | |
| 41 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, | |
| 42 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, | |
| 43 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, | |
| 44 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, | |
| 45 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, | |
| 46 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, | |
| 47 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, | |
| 48 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, | |
| 49 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, | |
| 50 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, | |
| 51 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, | |
| 52 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, | |
| 53 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, | |
| 54 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, | |
| 55 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, | |
| 56 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, | |
| 57 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, | |
| 58 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, | |
| 59 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, | |
| 60 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, | |
| 61 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, | |
| 62 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, | |
| 63 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, | |
| 64 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, | |
| 65 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, | |
| 66 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, | |
| 67 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, | |
| 68 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, | |
| 69 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, | |
| 70 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD | |
| 71 }; | |
| 72 | |
| 73 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
74 /** prime number used in DH exchange */ |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
75 static guchar dh_prime[] = { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
76 0xCF, 0x84, 0xAF, 0xCE, 0x86, 0xDD, 0xFA, 0x52, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
77 0x7F, 0x13, 0x6D, 0x10, 0x35, 0x75, 0x28, 0xEE, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
78 0xFB, 0xA0, 0xAF, 0xEF, 0x80, 0x8F, 0x29, 0x17, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
79 0x4E, 0x3B, 0x6A, 0x9E, 0x97, 0x00, 0x01, 0x71, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
80 0x7C, 0x8F, 0x10, 0x6C, 0x41, 0xC1, 0x61, 0xA6, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
81 0xCE, 0x91, 0x05, 0x7B, 0x34, 0xDA, 0x62, 0xCB, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
82 0xB8, 0x7B, 0xFD, 0xC1, 0xB3, 0x5C, 0x1B, 0x91, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
83 0x0F, 0xEA, 0x72, 0x24, 0x9D, 0x56, 0x6B, 0x9F |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
84 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
85 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
86 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
87 /** base used in DH exchange */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
88 #define DH_BASE 3 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
89 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
90 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
91 struct mwMpi *mwMpi_new() { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
92 struct mwMpi *i; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
93 i = g_new0(struct mwMpi, 1); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
94 mp_init(&i->i); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
95 return i; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
96 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
97 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
98 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
99 void mwMpi_free(struct mwMpi *i) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
100 if(! i) return; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
101 mp_clear(&i->i); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
102 g_free(i); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
103 } |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
104 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
105 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
106 static void mwInitDHPrime(mp_int *i) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
107 mp_init(i); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
108 mp_read_unsigned_bin(i, dh_prime, 64); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
109 } |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
110 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
111 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
112 void mwMpi_setDHPrime(struct mwMpi *i) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
113 g_return_if_fail(i != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
114 mp_read_unsigned_bin(&i->i, dh_prime, 64); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
115 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
116 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
117 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
118 static void mwInitDHBase(mp_int *i) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
119 mp_init(i); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
120 mp_set_int(i, DH_BASE); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
121 } |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
122 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
123 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
124 void mwMpi_setDHBase(struct mwMpi *i) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
125 g_return_if_fail(i != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
126 mp_set_int(&i->i, DH_BASE); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
127 } |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
128 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
129 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
130 static void mp_set_rand(mp_int *i, guint bits) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
131 size_t len, l; |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
132 guchar *buf; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
133 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
134 l = len = (bits / 8) + 1; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
135 buf = g_malloc(len); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
136 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
137 srand(clock()); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
138 while(l--) buf[l] = rand() & 0xff; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
139 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
140 buf[0] &= (0xff >> (8 - (bits % 8))); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
141 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
142 mp_read_unsigned_bin(i, buf, len); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
143 g_free(buf); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
144 } |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
145 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
146 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
147 void mwMpi_rand(struct mwMpi *i, guint bits) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
148 g_return_if_fail(i != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
149 mp_set_rand(&i->i, bits); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
150 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
151 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
152 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
153 static void mwDHRandKeypair(mp_int *private, mp_int *public) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
154 mp_int prime, base; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
155 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
156 mwInitDHPrime(&prime); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
157 mwInitDHBase(&base); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
158 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
159 mp_set_rand(private, 512); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
160 mp_exptmod(&base, private, &prime, public); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
161 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
162 mp_clear(&prime); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
163 mp_clear(&base); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
164 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
165 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
166 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
167 void mwMpi_randDHKeypair(struct mwMpi *private, struct mwMpi *public) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
168 g_return_if_fail(private != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
169 g_return_if_fail(public != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
170 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
171 mwDHRandKeypair(&private->i, &public->i); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
172 } |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
173 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
174 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
175 static void mwDHCalculateShared(mp_int *shared, mp_int *remote, |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
176 mp_int *private) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
177 mp_int prime; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
178 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
179 mwInitDHPrime(&prime); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
180 mp_exptmod(remote, private, &prime, shared); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
181 mp_clear(&prime); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
182 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
183 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
184 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
185 void mwMpi_calculateDHShared(struct mwMpi *shared, struct mwMpi *remote, |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
186 struct mwMpi *private) { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
187 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
188 g_return_if_fail(shared != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
189 g_return_if_fail(remote != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
190 g_return_if_fail(private != NULL); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
191 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
192 mwDHCalculateShared(&shared->i, &remote->i, &private->i); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
193 } |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
194 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
195 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
196 static void mwDHImportKey(mp_int *key, struct mwOpaque *o) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
197 mp_read_unsigned_bin(key, o->data, o->len); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
198 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
199 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
200 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
201 void mwMpi_import(struct mwMpi *i, struct mwOpaque *o) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
202 g_return_if_fail(i != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
203 g_return_if_fail(o != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
204 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
205 mwDHImportKey(&i->i, o); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
206 } |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
207 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
208 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
209 static void mwDHExportKey(mp_int *key, struct mwOpaque *o) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
210 o->len = mp_unsigned_bin_size(key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
211 o->data = g_malloc0(o->len); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
212 mp_to_unsigned_bin(key, o->data); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
213 } |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
214 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
215 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
216 void mwMpi_export(struct mwMpi *i, struct mwOpaque *o) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
217 g_return_if_fail(i != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
218 g_return_if_fail(o != NULL); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
219 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
220 mwDHExportKey(&i->i, o); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
221 } |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
222 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
223 |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
224 void mwKeyRandom(guchar *key, gsize keylen) { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
225 g_return_if_fail(key != NULL); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
226 |
| 10969 | 227 srand(clock()); |
| 228 while(keylen--) key[keylen] = rand() & 0xff; | |
| 229 } | |
| 230 | |
| 231 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
232 void mwIV_init(guchar *iv) { |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
233 int i; |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
234 static guchar normal_iv[] = { |
| 10969 | 235 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef |
| 236 }; | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
237 for(i = 8; i--; iv[i] = normal_iv[i]); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
238 /* memcpy(iv, normal_iv, 8); */ |
| 10969 | 239 } |
| 240 | |
| 241 | |
| 242 /* This does not seem to produce the same results as normal RC2 key | |
| 243 expansion would, but it works, so eh. It might be smart to farm | |
| 244 this out to mozilla or openssl */ | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
245 void mwKeyExpand(int *ekey, const guchar *key, gsize keylen) { |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
246 guchar tmp[128]; |
| 10969 | 247 int i, j; |
| 248 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
249 g_return_if_fail(keylen > 0); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
250 g_return_if_fail(key != NULL); |
| 10969 | 251 |
| 252 if(keylen > 128) keylen = 128; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
253 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
254 /* fill the first chunk with what key bytes we have */ |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
255 for(i = keylen; i--; tmp[i] = key[i]); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
256 /* memcpy(tmp, key, keylen); */ |
| 10969 | 257 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
258 /* build the remaining key from the given data */ |
| 10969 | 259 for(i = 0; keylen < 128; i++) { |
| 260 tmp[keylen] = PT[ (tmp[keylen - 1] + tmp[i]) & 0xff ]; | |
| 261 keylen++; | |
| 262 } | |
| 263 | |
| 264 tmp[0] = PT[ tmp[0] & 0xff ]; | |
| 265 | |
| 266 for(i = 0, j = 0; i < 64; i++) { | |
| 267 ekey[i] = (tmp[j] & 0xff) | (tmp[j+1] << 8); | |
| 268 j += 2; | |
| 269 } | |
| 270 } | |
| 271 | |
| 272 | |
| 273 /* normal RC2 encryption given a full 128-byte (as 64 ints) key */ | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
274 static void mwEncryptBlock(const int *ekey, guchar *out) { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
275 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
276 int a, b, c, d; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
277 int i, j; |
| 10969 | 278 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
279 a = (out[7] << 8) | (out[6] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
280 b = (out[5] << 8) | (out[4] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
281 c = (out[3] << 8) | (out[2] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
282 d = (out[1] << 8) | (out[0] & 0xff); |
| 10969 | 283 |
| 284 for(i = 0; i < 16; i++) { | |
| 285 j = i * 4; | |
| 286 | |
| 287 d += ((c & (a ^ 0xffff)) + (b & a) + ekey[j++]); | |
| 288 d = (d << 1) | (d >> 15 & 0x0001); | |
| 289 | |
| 290 c += ((b & (d ^ 0xffff)) + (a & d) + ekey[j++]); | |
| 291 c = (c << 2) | (c >> 14 & 0x0003); | |
| 292 | |
| 293 b += ((a & (c ^ 0xffff)) + (d & c) + ekey[j++]); | |
| 294 b = (b << 3) | (b >> 13 & 0x0007); | |
| 295 | |
| 296 a += ((d & (b ^ 0xffff)) + (c & b) + ekey[j++]); | |
| 297 a = (a << 5) | (a >> 11 & 0x001f); | |
| 298 | |
| 299 if(i == 4 || i == 10) { | |
| 300 d += ekey[a & 0x003f]; | |
| 301 c += ekey[d & 0x003f]; | |
| 302 b += ekey[c & 0x003f]; | |
| 303 a += ekey[b & 0x003f]; | |
| 304 } | |
| 305 } | |
| 306 | |
| 307 *out++ = d & 0xff; | |
| 308 *out++ = (d >> 8) & 0xff; | |
| 309 *out++ = c & 0xff; | |
| 310 *out++ = (c >> 8) & 0xff; | |
| 311 *out++ = b & 0xff; | |
| 312 *out++ = (b >> 8) & 0xff; | |
| 313 *out++ = a & 0xff; | |
| 314 *out++ = (a >> 8) & 0xff; | |
| 315 } | |
| 316 | |
| 317 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
318 void mwEncryptExpanded(const int *ekey, guchar *iv, |
| 10969 | 319 struct mwOpaque *in_data, |
| 320 struct mwOpaque *out_data) { | |
| 321 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
322 guchar *i = in_data->data; |
| 10969 | 323 gsize i_len = in_data->len; |
| 324 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
325 guchar *o; |
| 10969 | 326 gsize o_len; |
| 327 | |
| 328 int x, y; | |
| 329 | |
| 330 /* pad upwards to a multiple of 8 */ | |
| 331 o_len = (i_len & -8) + 8; | |
| 332 o = g_malloc(o_len); | |
| 333 | |
| 334 out_data->data = o; | |
| 335 out_data->len = o_len; | |
| 336 | |
| 337 /* figure out the amount of padding */ | |
| 338 y = o_len - i_len; | |
| 339 | |
| 340 /* copy in to out, and write padding bytes */ | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
341 for(x = i_len; x--; o[x] = i[x]); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
342 for(x = i_len; x < o_len; o[x++] = y); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
343 /* memcpy(o, i, i_len); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
344 memset(o + i_len, y, y); */ |
| 10969 | 345 |
| 346 /* encrypt in blocks */ | |
| 347 for(x = o_len; x > 0; x -= 8) { | |
| 348 for(y = 8; y--; o[y] ^= iv[y]); | |
| 349 mwEncryptBlock(ekey, o); | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
350 for(y = 8; y--; iv[y] = o[y]); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
351 /* memcpy(iv, o, 8); */ |
| 10969 | 352 o += 8; |
| 353 } | |
| 354 } | |
| 355 | |
| 356 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
357 void mwEncrypt(const guchar *key, gsize keylen, |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
358 guchar *iv, |
| 10969 | 359 struct mwOpaque *in, struct mwOpaque *out) { |
| 360 | |
| 361 int ekey[64]; | |
| 362 mwKeyExpand(ekey, key, keylen); | |
| 363 mwEncryptExpanded(ekey, iv, in, out); | |
| 364 } | |
| 365 | |
| 366 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
367 static void mwDecryptBlock(const int *ekey, guchar *out) { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
368 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
369 int a, b, c, d; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
370 int i, j; |
| 10969 | 371 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
372 a = (out[7] << 8) | (out[6] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
373 b = (out[5] << 8) | (out[4] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
374 c = (out[3] << 8) | (out[2] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
375 d = (out[1] << 8) | (out[0] & 0xff); |
| 10969 | 376 |
| 377 for(i = 16; i--; ) { | |
| 378 j = i * 4 + 3; | |
| 379 | |
| 380 a = (a << 11) | (a >> 5 & 0x07ff); | |
| 381 a -= ((d & (b ^ 0xffff)) + (c & b) + ekey[j--]); | |
| 382 | |
| 383 b = (b << 13) | (b >> 3 & 0x1fff); | |
| 384 b -= ((a & (c ^ 0xffff)) + (d & c) + ekey[j--]); | |
| 385 | |
| 386 c = (c << 14) | (c >> 2 & 0x3fff); | |
| 387 c -= ((b & (d ^ 0xffff)) + (a & d) + ekey[j--]); | |
| 388 | |
| 389 d = (d << 15) | (d >> 1 & 0x7fff); | |
| 390 d -= ((c & (a ^ 0xffff)) + (b & a) + ekey[j--]); | |
| 391 | |
| 392 if(i == 5 || i == 11) { | |
| 393 a -= ekey[b & 0x003f]; | |
| 394 b -= ekey[c & 0x003f]; | |
| 395 c -= ekey[d & 0x003f]; | |
| 396 d -= ekey[a & 0x003f]; | |
| 397 } | |
| 398 } | |
| 399 | |
| 400 *out++ = d & 0xff; | |
| 401 *out++ = (d >> 8) & 0xff; | |
| 402 *out++ = c & 0xff; | |
| 403 *out++ = (c >> 8) & 0xff; | |
| 404 *out++ = b & 0xff; | |
| 405 *out++ = (b >> 8) & 0xff; | |
| 406 *out++ = a & 0xff; | |
| 407 *out++ = (a >> 8) & 0xff; | |
| 408 } | |
| 409 | |
| 410 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
411 void mwDecryptExpanded(const int *ekey, guchar *iv, |
| 10969 | 412 struct mwOpaque *in_data, |
| 413 struct mwOpaque *out_data) { | |
| 414 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
415 guchar *i = in_data->data; |
| 10969 | 416 gsize i_len = in_data->len; |
| 417 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
418 guchar *o; |
| 10969 | 419 gsize o_len; |
| 420 | |
| 421 int x, y; | |
| 422 | |
| 423 /* this doesn't check to ensure that in_data->len is a multiple of | |
| 424 8, which is damn well ought to be. */ | |
| 425 | |
| 426 o = g_malloc(i_len); | |
| 427 o_len = i_len; | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
428 for(x = i_len; x--; o[x] = i[x]); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
429 /* memcpy(o, i, i_len); */ |
| 10969 | 430 |
| 431 out_data->data = o; | |
| 432 out_data->len = o_len; | |
| 433 | |
| 434 for(x = o_len; x > 0; x -= 8) { | |
| 435 /* decrypt a block */ | |
| 436 mwDecryptBlock(ekey, o); | |
| 437 | |
| 438 /* modify the initialization vector */ | |
| 439 for(y = 8; y--; o[y] ^= iv[y]); | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
440 for(y = 8; y--; iv[y] = i[y]); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
441 /* memcpy(iv, i, 8); */ |
| 10969 | 442 i += 8; |
| 443 o += 8; | |
| 444 } | |
| 445 | |
| 446 /* shorten the length by the value of the filler in the padding | |
| 447 bytes */ | |
| 448 out_data->len -= *(o - 1); | |
| 449 } | |
| 450 | |
| 451 | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
452 void mwDecrypt(const guchar *key, gsize keylen, guchar *iv, |
| 10969 | 453 struct mwOpaque *in, struct mwOpaque *out) { |
| 454 | |
| 455 int ekey[64]; | |
| 456 mwKeyExpand(ekey, key, keylen); | |
| 457 mwDecryptExpanded(ekey, iv, in, out); | |
| 458 } | |
| 459 | |
| 460 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
461 |
| 10969 | 462 struct mwCipher_RC2_40 { |
| 463 struct mwCipher cipher; | |
| 464 int session_key[64]; | |
| 465 gboolean ready; | |
| 466 }; | |
| 467 | |
| 468 | |
| 469 struct mwCipherInstance_RC2_40 { | |
| 470 struct mwCipherInstance instance; | |
| 471 int incoming_key[64]; | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
472 guchar outgoing_iv[8]; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
473 guchar incoming_iv[8]; |
| 10969 | 474 }; |
| 475 | |
| 476 | |
| 477 static const char *get_name_RC2_40() { | |
| 478 return "RC2/40 Cipher"; | |
| 479 } | |
| 480 | |
| 481 | |
| 482 static const char *get_desc_RC2_40() { | |
| 483 return "RC2, 40-bit effective key"; | |
| 484 } | |
| 485 | |
| 486 | |
| 487 static int encrypt_RC2_40(struct mwCipherInstance *ci, | |
| 488 struct mwOpaque *data) { | |
| 489 | |
| 490 struct mwCipherInstance_RC2_40 *cir; | |
| 491 struct mwCipher_RC2_40 *cr; | |
| 492 struct mwOpaque o = { 0, 0 }; | |
| 493 | |
| 494 cir = (struct mwCipherInstance_RC2_40 *) ci; | |
| 495 cr = (struct mwCipher_RC2_40 *) ci->cipher; | |
| 496 | |
| 497 mwEncryptExpanded(cr->session_key, cir->outgoing_iv, data, &o); | |
| 498 | |
| 499 mwOpaque_clear(data); | |
| 500 data->data = o.data; | |
| 501 data->len = o.len; | |
| 502 | |
| 503 return 0; | |
| 504 } | |
| 505 | |
| 506 | |
| 507 static int decrypt_RC2_40(struct mwCipherInstance *ci, | |
| 508 struct mwOpaque *data) { | |
| 509 | |
| 510 struct mwCipherInstance_RC2_40 *cir; | |
| 511 struct mwCipher_RC2_40 *cr; | |
| 512 struct mwOpaque o = { 0, 0 }; | |
| 513 | |
| 514 cir = (struct mwCipherInstance_RC2_40 *) ci; | |
| 515 cr = (struct mwCipher_RC2_40 *) ci->cipher; | |
| 516 | |
| 517 mwDecryptExpanded(cir->incoming_key, cir->incoming_iv, data, &o); | |
| 518 | |
| 519 mwOpaque_clear(data); | |
| 520 data->data = o.data; | |
| 521 data->len = o.len; | |
| 522 | |
| 523 return 0; | |
| 524 } | |
| 525 | |
| 526 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
527 static struct mwCipherInstance * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
528 new_instance_RC2_40(struct mwCipher *cipher, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
529 struct mwChannel *chan) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
530 |
| 10969 | 531 struct mwCipher_RC2_40 *cr; |
| 532 struct mwCipherInstance_RC2_40 *cir; | |
| 533 struct mwCipherInstance *ci; | |
| 534 | |
| 535 cr = (struct mwCipher_RC2_40 *) cipher; | |
| 536 | |
| 537 /* a bit of lazy initialization here */ | |
| 538 if(! cr->ready) { | |
| 539 struct mwLoginInfo *info = mwSession_getLoginInfo(cipher->session); | |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
540 mwKeyExpand(cr->session_key, (guchar *) info->login_id, 5); |
| 10969 | 541 cr->ready = TRUE; |
| 542 } | |
| 543 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
544 cir = g_new0(struct mwCipherInstance_RC2_40, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
545 ci = &cir->instance; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
546 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
547 ci->cipher = cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
548 ci->channel = chan; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
549 |
| 10969 | 550 mwIV_init(cir->incoming_iv); |
| 551 mwIV_init(cir->outgoing_iv); | |
| 552 | |
| 553 return ci; | |
| 554 } | |
| 555 | |
| 556 | |
| 557 static struct mwEncryptItem *new_item_RC2_40(struct mwCipherInstance *ci) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
558 struct mwEncryptItem *e; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
559 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
560 e = g_new0(struct mwEncryptItem, 1); |
| 10969 | 561 e->id = mwCipher_RC2_40; |
| 562 return e; | |
| 563 } | |
| 564 | |
| 565 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
566 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
567 offer_RC2_40(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
568 return new_item_RC2_40(ci); |
| 10969 | 569 } |
| 570 | |
| 571 | |
| 572 static void accepted_RC2_40(struct mwCipherInstance *ci, | |
| 573 struct mwEncryptItem *item) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
574 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
575 struct mwCipherInstance_RC2_40 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
576 struct mwLoginInfo *info; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
577 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
578 cir = (struct mwCipherInstance_RC2_40 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
579 info = mwChannel_getUser(ci->channel); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
580 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
581 if(info->login_id) { |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
582 mwKeyExpand(cir->incoming_key, (guchar *) info->login_id, 5); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
583 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
584 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
585 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
586 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
587 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
588 accept_RC2_40(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
589 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
590 accepted_RC2_40(ci, NULL); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
591 return new_item_RC2_40(ci); |
| 10969 | 592 } |
| 593 | |
| 594 | |
| 595 struct mwCipher *mwCipher_new_RC2_40(struct mwSession *s) { | |
| 596 struct mwCipher_RC2_40 *cr = g_new0(struct mwCipher_RC2_40, 1); | |
| 597 struct mwCipher *c = &cr->cipher; | |
| 598 | |
| 599 c->session = s; | |
| 600 c->type = mwCipher_RC2_40; | |
| 601 c->get_name = get_name_RC2_40; | |
| 602 c->get_desc = get_desc_RC2_40; | |
| 603 c->new_instance = new_instance_RC2_40; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
604 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
605 c->offer = offer_RC2_40; |
| 10969 | 606 |
| 607 c->accepted = accepted_RC2_40; | |
| 608 c->accept = accept_RC2_40; | |
| 609 | |
| 610 c->encrypt = encrypt_RC2_40; | |
| 611 c->decrypt = decrypt_RC2_40; | |
| 612 | |
| 613 return c; | |
| 614 } | |
| 615 | |
| 616 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
617 struct mwCipher_RC2_128 { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
618 struct mwCipher cipher; |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
619 mp_int private_key; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
620 struct mwOpaque public_key; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
621 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
622 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
623 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
624 struct mwCipherInstance_RC2_128 { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
625 struct mwCipherInstance instance; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
626 int shared[64]; /* shared secret determined via DH exchange */ |
|
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
627 guchar outgoing_iv[8]; |
|
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
628 guchar incoming_iv[8]; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
629 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
630 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
631 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
632 static const char *get_name_RC2_128() { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
633 return "RC2/128 Cipher"; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
634 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
635 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
636 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
637 static const char *get_desc_RC2_128() { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
638 return "RC2, DH shared secret key"; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
639 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
640 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
641 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
642 static struct mwCipherInstance * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
643 new_instance_RC2_128(struct mwCipher *cipher, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
644 struct mwChannel *chan) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
645 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
646 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
647 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
648 struct mwCipherInstance *ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
649 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
650 cr = (struct mwCipher_RC2_128 *) cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
651 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
652 cir = g_new0(struct mwCipherInstance_RC2_128, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
653 ci = &cir->instance; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
654 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
655 ci->cipher = cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
656 ci->channel = chan; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
657 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
658 mwIV_init(cir->incoming_iv); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
659 mwIV_init(cir->outgoing_iv); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
660 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
661 return ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
662 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
663 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
664 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
665 static void offered_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
666 struct mwEncryptItem *item) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
667 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
668 mp_int remote_key; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
669 mp_int shared; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
670 struct mwOpaque sho = { 0, 0 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
671 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
672 struct mwCipher *c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
673 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
674 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
675 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
676 c = ci->cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
677 cr = (struct mwCipher_RC2_128 *) c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
678 cir = (struct mwCipherInstance_RC2_128 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
679 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
680 mp_init(&remote_key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
681 mp_init(&shared); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
682 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
683 mwDHImportKey(&remote_key, &item->info); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
684 mwDHCalculateShared(&shared, &remote_key, &cr->private_key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
685 mwDHExportKey(&shared, &sho); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
686 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
687 /* key expanded from the last 16 bytes of the DH shared secret. This |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
688 took me forever to figure out. 16 bytes is 128 bit. */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
689 /* the sh_len-16 is important, because the key len could |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
690 hypothetically start with 8bits or more unset, meaning the |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
691 exported key might be less than 64 bytes in length */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
692 mwKeyExpand(cir->shared, sho.data+(sho.len-16), 16); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
693 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
694 mp_clear(&remote_key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
695 mp_clear(&shared); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
696 mwOpaque_clear(&sho); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
697 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
698 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
699 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
700 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
701 offer_RC2_128(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
702 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
703 struct mwCipher *c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
704 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
705 struct mwEncryptItem *ei; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
706 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
707 c = ci->cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
708 cr = (struct mwCipher_RC2_128 *) c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
709 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
710 ei = g_new0(struct mwEncryptItem, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
711 ei->id = mwCipher_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
712 mwOpaque_clone(&ei->info, &cr->public_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
713 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
714 return ei; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
715 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
716 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
717 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
718 static void accepted_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
719 struct mwEncryptItem *item) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
720 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
721 return offered_RC2_128(ci, item); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
722 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
723 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
724 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
725 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
726 accept_RC2_128(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
727 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
728 return offer_RC2_128(ci); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
729 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
730 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
731 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
732 static int encrypt_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
733 struct mwOpaque *data) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
734 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
735 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
736 struct mwOpaque o = { 0, 0 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
737 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
738 cir = (struct mwCipherInstance_RC2_128 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
739 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
740 mwEncryptExpanded(cir->shared, cir->outgoing_iv, data, &o); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
741 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
742 mwOpaque_clear(data); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
743 data->data = o.data; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
744 data->len = o.len; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
745 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
746 return 0; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
747 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
748 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
749 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
750 static int decrypt_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
751 struct mwOpaque *data) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
752 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
753 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
754 struct mwOpaque o = { 0, 0 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
755 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
756 cir = (struct mwCipherInstance_RC2_128 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
757 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
758 mwDecryptExpanded(cir->shared, cir->incoming_iv, data, &o); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
759 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
760 mwOpaque_clear(data); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
761 data->data = o.data; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
762 data->len = o.len; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
763 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
764 return 0; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
765 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
766 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
767 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
768 static void clear_RC2_128(struct mwCipher *c) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
769 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
770 cr = (struct mwCipher_RC2_128 *) c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
771 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
772 mp_clear(&cr->private_key); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
773 mwOpaque_clear(&cr->public_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
774 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
775 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
776 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
777 struct mwCipher *mwCipher_new_RC2_128(struct mwSession *s) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
778 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
779 struct mwCipher *c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
780 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
781 mp_int pubkey; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
782 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
783 cr = g_new0(struct mwCipher_RC2_128, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
784 c = &cr->cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
785 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
786 c->session = s; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
787 c->type = mwCipher_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
788 c->get_name = get_name_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
789 c->get_desc = get_desc_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
790 c->new_instance = new_instance_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
791 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
792 c->offered = offered_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
793 c->offer = offer_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
794 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
795 c->accepted = accepted_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
796 c->accept = accept_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
797 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
798 c->encrypt = encrypt_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
799 c->decrypt = decrypt_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
800 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
801 c->clear = clear_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
802 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
803 mp_init(&cr->private_key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
804 mp_init(&pubkey); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
805 mwDHRandKeypair(&cr->private_key, &pubkey); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
806 mwDHExportKey(&pubkey, &cr->public_key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
807 mp_clear(&pubkey); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
808 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
809 return c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
810 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
811 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
812 |
| 10969 | 813 struct mwSession *mwCipher_getSession(struct mwCipher *cipher) { |
| 814 g_return_val_if_fail(cipher != NULL, NULL); | |
| 815 return cipher->session; | |
| 816 } | |
| 817 | |
| 818 | |
| 819 guint16 mwCipher_getType(struct mwCipher *cipher) { | |
| 820 /* oh man, this is a bad failover... who the hell decided to make | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
821 zero a real cipher id? */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
822 g_return_val_if_fail(cipher != NULL, 0xffff); |
| 10969 | 823 return cipher->type; |
| 824 } | |
| 825 | |
| 826 | |
| 827 const char *mwCipher_getName(struct mwCipher *cipher) { | |
| 828 g_return_val_if_fail(cipher != NULL, NULL); | |
| 829 g_return_val_if_fail(cipher->get_name != NULL, NULL); | |
| 830 return cipher->get_name(); | |
| 831 } | |
| 832 | |
| 833 | |
| 834 const char *mwCipher_getDesc(struct mwCipher *cipher) { | |
| 835 g_return_val_if_fail(cipher != NULL, NULL); | |
| 836 g_return_val_if_fail(cipher->get_desc != NULL, NULL); | |
| 837 return cipher->get_desc(); | |
| 838 } | |
| 839 | |
| 840 | |
| 841 void mwCipher_free(struct mwCipher *cipher) { | |
| 842 if(! cipher) return; | |
| 843 | |
| 844 if(cipher->clear) | |
| 845 cipher->clear(cipher); | |
| 846 | |
| 847 g_free(cipher); | |
| 848 } | |
| 849 | |
| 850 | |
| 851 struct mwCipherInstance *mwCipher_newInstance(struct mwCipher *cipher, | |
| 852 struct mwChannel *chan) { | |
| 853 g_return_val_if_fail(cipher != NULL, NULL); | |
| 854 g_return_val_if_fail(chan != NULL, NULL); | |
| 855 g_return_val_if_fail(cipher->new_instance != NULL, NULL); | |
| 856 return cipher->new_instance(cipher, chan); | |
| 857 } | |
| 858 | |
| 859 | |
| 860 struct mwCipher *mwCipherInstance_getCipher(struct mwCipherInstance *ci) { | |
| 861 g_return_val_if_fail(ci != NULL, NULL); | |
| 862 return ci->cipher; | |
| 863 } | |
| 864 | |
| 865 | |
| 866 struct mwChannel *mwCipherInstance_getChannel(struct mwCipherInstance *ci) { | |
| 867 g_return_val_if_fail(ci != NULL, NULL); | |
| 868 return ci->channel; | |
| 869 } | |
| 870 | |
| 871 | |
| 872 void mwCipherInstance_offered(struct mwCipherInstance *ci, | |
| 873 struct mwEncryptItem *item) { | |
| 874 struct mwCipher *cipher; | |
| 875 | |
| 876 g_return_if_fail(ci != NULL); | |
| 877 | |
| 878 cipher = ci->cipher; | |
| 879 g_return_if_fail(cipher != NULL); | |
| 880 | |
| 881 if(cipher->offered) cipher->offered(ci, item); | |
| 882 } | |
| 883 | |
| 884 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
885 struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
886 mwCipherInstance_offer(struct mwCipherInstance *ci) { |
| 10969 | 887 struct mwCipher *cipher; |
| 888 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
889 g_return_val_if_fail(ci != NULL, NULL); |
| 10969 | 890 |
| 891 cipher = ci->cipher; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
892 g_return_val_if_fail(cipher != NULL, NULL); |
| 10969 | 893 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
894 return cipher->offer(ci); |
| 10969 | 895 } |
| 896 | |
| 897 | |
| 898 void mwCipherInstance_accepted(struct mwCipherInstance *ci, | |
| 899 struct mwEncryptItem *item) { | |
| 900 struct mwCipher *cipher; | |
| 901 | |
| 902 g_return_if_fail(ci != NULL); | |
| 903 | |
| 904 cipher = ci->cipher; | |
| 905 g_return_if_fail(cipher != NULL); | |
| 906 | |
| 907 if(cipher->accepted) cipher->accepted(ci, item); | |
| 908 } | |
| 909 | |
| 910 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
911 struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
912 mwCipherInstance_accept(struct mwCipherInstance *ci) { |
| 10969 | 913 struct mwCipher *cipher; |
| 914 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
915 g_return_val_if_fail(ci != NULL, NULL); |
| 10969 | 916 |
| 917 cipher = ci->cipher; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
918 g_return_val_if_fail(cipher != NULL, NULL); |
| 10969 | 919 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
920 return cipher->accept(ci); |
| 10969 | 921 } |
| 922 | |
| 923 | |
| 924 int mwCipherInstance_encrypt(struct mwCipherInstance *ci, | |
| 925 struct mwOpaque *data) { | |
| 926 struct mwCipher *cipher; | |
| 927 | |
| 928 g_return_val_if_fail(data != NULL, 0); | |
| 929 | |
| 930 if(! ci) return 0; | |
| 931 cipher = ci->cipher; | |
| 932 | |
| 933 g_return_val_if_fail(cipher != NULL, -1); | |
| 934 | |
| 935 return (cipher->encrypt)? | |
| 936 cipher->encrypt(ci, data): 0; | |
| 937 } | |
| 938 | |
| 939 | |
| 940 int mwCipherInstance_decrypt(struct mwCipherInstance *ci, | |
| 941 struct mwOpaque *data) { | |
| 942 struct mwCipher *cipher; | |
| 943 | |
| 944 g_return_val_if_fail(data != NULL, 0); | |
| 945 | |
| 946 if(! ci) return 0; | |
| 947 cipher = ci->cipher; | |
| 948 | |
| 949 g_return_val_if_fail(cipher != NULL, -1); | |
| 950 | |
| 951 return (cipher->decrypt)? | |
| 952 cipher->decrypt(ci, data): 0; | |
| 953 } | |
| 954 | |
| 955 | |
| 956 void mwCipherInstance_free(struct mwCipherInstance *ci) { | |
| 957 struct mwCipher *cipher; | |
| 958 | |
| 959 if(! ci) return; | |
| 960 | |
| 961 cipher = ci->cipher; | |
| 962 | |
| 963 if(cipher && cipher->clear_instance) | |
| 964 cipher->clear_instance(ci); | |
| 965 | |
| 966 g_free(ci); | |
| 967 } | |
| 968 |
