Mercurial > pidgin
annotate src/protocols/sametime/meanwhile/cipher.c @ 12301:39fca2edf7da
[gaim-migrate @ 14605]
I only caught this as I was committing, and besides I forgot to mention what
sadrul's patch did. It puts the emblem for the active status on the accounts
in the Accounts menu (he put them in the Remove menu as well but that felt
wrong to me.)
committer: Tailor Script <tailor@pidgin.im>
| author | Etan Reisner <pidgin@unreliablesource.net> |
|---|---|
| date | Sat, 03 Dec 2005 06:50:41 +0000 |
| parents | 2edf5dc1b2ea |
| children | a2ebf585d8c6 |
| 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 */ |
| 38 static unsigned char PT[] = { | |
| 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 */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
75 static unsigned char dh_prime[] = { |
|
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; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
132 unsigned char *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 |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
224 void mwKeyRandom(unsigned char *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 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
232 void mwIV_init(unsigned char *iv) { |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
233 int i; |
| 10969 | 234 static unsigned char normal_iv[] = { |
| 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 */ | |
| 245 void mwKeyExpand(int *ekey, const char *key, gsize keylen) { | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
246 unsigned char 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 */ | |
| 274 static void mwEncryptBlock(const int *ekey, char *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 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
318 void mwEncryptExpanded(const int *ekey, unsigned char *iv, |
| 10969 | 319 struct mwOpaque *in_data, |
| 320 struct mwOpaque *out_data) { | |
| 321 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
322 unsigned char *i = in_data->data; |
| 10969 | 323 gsize i_len = in_data->len; |
| 324 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
325 unsigned char *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 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
357 void mwEncrypt(const char *key, gsize keylen, unsigned char *iv, |
| 10969 | 358 struct mwOpaque *in, struct mwOpaque *out) { |
| 359 | |
| 360 int ekey[64]; | |
| 361 mwKeyExpand(ekey, key, keylen); | |
| 362 mwEncryptExpanded(ekey, iv, in, out); | |
| 363 } | |
| 364 | |
| 365 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
366 static void mwDecryptBlock(const int *ekey, unsigned char *out) { |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
367 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
368 int a, b, c, d; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
369 int i, j; |
| 10969 | 370 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
371 a = (out[7] << 8) | (out[6] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
372 b = (out[5] << 8) | (out[4] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
373 c = (out[3] << 8) | (out[2] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
374 d = (out[1] << 8) | (out[0] & 0xff); |
| 10969 | 375 |
| 376 for(i = 16; i--; ) { | |
| 377 j = i * 4 + 3; | |
| 378 | |
| 379 a = (a << 11) | (a >> 5 & 0x07ff); | |
| 380 a -= ((d & (b ^ 0xffff)) + (c & b) + ekey[j--]); | |
| 381 | |
| 382 b = (b << 13) | (b >> 3 & 0x1fff); | |
| 383 b -= ((a & (c ^ 0xffff)) + (d & c) + ekey[j--]); | |
| 384 | |
| 385 c = (c << 14) | (c >> 2 & 0x3fff); | |
| 386 c -= ((b & (d ^ 0xffff)) + (a & d) + ekey[j--]); | |
| 387 | |
| 388 d = (d << 15) | (d >> 1 & 0x7fff); | |
| 389 d -= ((c & (a ^ 0xffff)) + (b & a) + ekey[j--]); | |
| 390 | |
| 391 if(i == 5 || i == 11) { | |
| 392 a -= ekey[b & 0x003f]; | |
| 393 b -= ekey[c & 0x003f]; | |
| 394 c -= ekey[d & 0x003f]; | |
| 395 d -= ekey[a & 0x003f]; | |
| 396 } | |
| 397 } | |
| 398 | |
| 399 *out++ = d & 0xff; | |
| 400 *out++ = (d >> 8) & 0xff; | |
| 401 *out++ = c & 0xff; | |
| 402 *out++ = (c >> 8) & 0xff; | |
| 403 *out++ = b & 0xff; | |
| 404 *out++ = (b >> 8) & 0xff; | |
| 405 *out++ = a & 0xff; | |
| 406 *out++ = (a >> 8) & 0xff; | |
| 407 } | |
| 408 | |
| 409 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
410 void mwDecryptExpanded(const int *ekey, unsigned char *iv, |
| 10969 | 411 struct mwOpaque *in_data, |
| 412 struct mwOpaque *out_data) { | |
| 413 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
414 unsigned char *i = in_data->data; |
| 10969 | 415 gsize i_len = in_data->len; |
| 416 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
417 unsigned char *o; |
| 10969 | 418 gsize o_len; |
| 419 | |
| 420 int x, y; | |
| 421 | |
| 422 /* this doesn't check to ensure that in_data->len is a multiple of | |
| 423 8, which is damn well ought to be. */ | |
| 424 | |
| 425 o = g_malloc(i_len); | |
| 426 o_len = i_len; | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
427 for(x = i_len; x--; o[x] = i[x]); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
428 /* memcpy(o, i, i_len); */ |
| 10969 | 429 |
| 430 out_data->data = o; | |
| 431 out_data->len = o_len; | |
| 432 | |
| 433 for(x = o_len; x > 0; x -= 8) { | |
| 434 /* decrypt a block */ | |
| 435 mwDecryptBlock(ekey, o); | |
| 436 | |
| 437 /* modify the initialization vector */ | |
| 438 for(y = 8; y--; o[y] ^= iv[y]); | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
439 for(y = 8; y--; iv[y] = i[y]); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
440 /* memcpy(iv, i, 8); */ |
| 10969 | 441 i += 8; |
| 442 o += 8; | |
| 443 } | |
| 444 | |
| 445 /* shorten the length by the value of the filler in the padding | |
| 446 bytes */ | |
| 447 out_data->len -= *(o - 1); | |
| 448 } | |
| 449 | |
| 450 | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
451 void mwDecrypt(const char *key, gsize keylen, unsigned char *iv, |
| 10969 | 452 struct mwOpaque *in, struct mwOpaque *out) { |
| 453 | |
| 454 int ekey[64]; | |
| 455 mwKeyExpand(ekey, key, keylen); | |
| 456 mwDecryptExpanded(ekey, iv, in, out); | |
| 457 } | |
| 458 | |
| 459 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
460 |
| 10969 | 461 struct mwCipher_RC2_40 { |
| 462 struct mwCipher cipher; | |
| 463 int session_key[64]; | |
| 464 gboolean ready; | |
| 465 }; | |
| 466 | |
| 467 | |
| 468 struct mwCipherInstance_RC2_40 { | |
| 469 struct mwCipherInstance instance; | |
| 470 int incoming_key[64]; | |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
471 unsigned char outgoing_iv[8]; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
472 unsigned char incoming_iv[8]; |
| 10969 | 473 }; |
| 474 | |
| 475 | |
| 476 static const char *get_name_RC2_40() { | |
| 477 return "RC2/40 Cipher"; | |
| 478 } | |
| 479 | |
| 480 | |
| 481 static const char *get_desc_RC2_40() { | |
| 482 return "RC2, 40-bit effective key"; | |
| 483 } | |
| 484 | |
| 485 | |
| 486 static int encrypt_RC2_40(struct mwCipherInstance *ci, | |
| 487 struct mwOpaque *data) { | |
| 488 | |
| 489 struct mwCipherInstance_RC2_40 *cir; | |
| 490 struct mwCipher_RC2_40 *cr; | |
| 491 struct mwOpaque o = { 0, 0 }; | |
| 492 | |
| 493 cir = (struct mwCipherInstance_RC2_40 *) ci; | |
| 494 cr = (struct mwCipher_RC2_40 *) ci->cipher; | |
| 495 | |
| 496 mwEncryptExpanded(cr->session_key, cir->outgoing_iv, data, &o); | |
| 497 | |
| 498 mwOpaque_clear(data); | |
| 499 data->data = o.data; | |
| 500 data->len = o.len; | |
| 501 | |
| 502 return 0; | |
| 503 } | |
| 504 | |
| 505 | |
| 506 static int decrypt_RC2_40(struct mwCipherInstance *ci, | |
| 507 struct mwOpaque *data) { | |
| 508 | |
| 509 struct mwCipherInstance_RC2_40 *cir; | |
| 510 struct mwCipher_RC2_40 *cr; | |
| 511 struct mwOpaque o = { 0, 0 }; | |
| 512 | |
| 513 cir = (struct mwCipherInstance_RC2_40 *) ci; | |
| 514 cr = (struct mwCipher_RC2_40 *) ci->cipher; | |
| 515 | |
| 516 mwDecryptExpanded(cir->incoming_key, cir->incoming_iv, data, &o); | |
| 517 | |
| 518 mwOpaque_clear(data); | |
| 519 data->data = o.data; | |
| 520 data->len = o.len; | |
| 521 | |
| 522 return 0; | |
| 523 } | |
| 524 | |
| 525 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
526 static struct mwCipherInstance * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
527 new_instance_RC2_40(struct mwCipher *cipher, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
528 struct mwChannel *chan) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
529 |
| 10969 | 530 struct mwCipher_RC2_40 *cr; |
| 531 struct mwCipherInstance_RC2_40 *cir; | |
| 532 struct mwCipherInstance *ci; | |
| 533 | |
| 534 cr = (struct mwCipher_RC2_40 *) cipher; | |
| 535 | |
| 536 /* a bit of lazy initialization here */ | |
| 537 if(! cr->ready) { | |
| 538 struct mwLoginInfo *info = mwSession_getLoginInfo(cipher->session); | |
| 539 mwKeyExpand(cr->session_key, info->login_id, 5); | |
| 540 cr->ready = TRUE; | |
| 541 } | |
| 542 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
543 cir = g_new0(struct mwCipherInstance_RC2_40, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
544 ci = &cir->instance; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
545 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
546 ci->cipher = cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
547 ci->channel = chan; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
548 |
| 10969 | 549 mwIV_init(cir->incoming_iv); |
| 550 mwIV_init(cir->outgoing_iv); | |
| 551 | |
| 552 return ci; | |
| 553 } | |
| 554 | |
| 555 | |
| 556 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
|
557 struct mwEncryptItem *e; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
558 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
559 e = g_new0(struct mwEncryptItem, 1); |
| 10969 | 560 e->id = mwCipher_RC2_40; |
| 561 return e; | |
| 562 } | |
| 563 | |
| 564 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
565 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
566 offer_RC2_40(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
567 return new_item_RC2_40(ci); |
| 10969 | 568 } |
| 569 | |
| 570 | |
| 571 static void accepted_RC2_40(struct mwCipherInstance *ci, | |
| 572 struct mwEncryptItem *item) { | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
573 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
574 struct mwCipherInstance_RC2_40 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
575 struct mwLoginInfo *info; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
576 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
577 cir = (struct mwCipherInstance_RC2_40 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
578 info = mwChannel_getUser(ci->channel); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
579 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
580 if(info->login_id) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
581 mwKeyExpand(cir->incoming_key, info->login_id, 5); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
582 } |
|
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 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
587 accept_RC2_40(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
588 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
589 accepted_RC2_40(ci, NULL); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
590 return new_item_RC2_40(ci); |
| 10969 | 591 } |
| 592 | |
| 593 | |
| 594 struct mwCipher *mwCipher_new_RC2_40(struct mwSession *s) { | |
| 595 struct mwCipher_RC2_40 *cr = g_new0(struct mwCipher_RC2_40, 1); | |
| 596 struct mwCipher *c = &cr->cipher; | |
| 597 | |
| 598 c->session = s; | |
| 599 c->type = mwCipher_RC2_40; | |
| 600 c->get_name = get_name_RC2_40; | |
| 601 c->get_desc = get_desc_RC2_40; | |
| 602 c->new_instance = new_instance_RC2_40; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
603 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
604 c->offer = offer_RC2_40; |
| 10969 | 605 |
| 606 c->accepted = accepted_RC2_40; | |
| 607 c->accept = accept_RC2_40; | |
| 608 | |
| 609 c->encrypt = encrypt_RC2_40; | |
| 610 c->decrypt = decrypt_RC2_40; | |
| 611 | |
| 612 return c; | |
| 613 } | |
| 614 | |
| 615 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
616 struct mwCipher_RC2_128 { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
617 struct mwCipher cipher; |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
618 mp_int private_key; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
619 struct mwOpaque public_key; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
620 }; |
|
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 struct mwCipherInstance_RC2_128 { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
624 struct mwCipherInstance instance; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
625 int shared[64]; /* shared secret determined via DH exchange */ |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
626 unsigned char outgoing_iv[8]; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
627 unsigned char incoming_iv[8]; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
628 }; |
|
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 static const char *get_name_RC2_128() { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
632 return "RC2/128 Cipher"; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
633 } |
|
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 static const char *get_desc_RC2_128() { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
637 return "RC2, DH shared secret key"; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
638 } |
|
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 static struct mwCipherInstance * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
642 new_instance_RC2_128(struct mwCipher *cipher, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
643 struct mwChannel *chan) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
644 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
645 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
646 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
647 struct mwCipherInstance *ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
648 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
649 cr = (struct mwCipher_RC2_128 *) cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
650 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
651 cir = g_new0(struct mwCipherInstance_RC2_128, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
652 ci = &cir->instance; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
653 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
654 ci->cipher = cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
655 ci->channel = chan; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
656 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
657 mwIV_init(cir->incoming_iv); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
658 mwIV_init(cir->outgoing_iv); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
659 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
660 return ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
661 } |
|
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 static void offered_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
665 struct mwEncryptItem *item) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
666 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
667 mp_int remote_key; |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
668 mp_int shared; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
669 struct mwOpaque sho = { 0, 0 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
670 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
671 struct mwCipher *c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
672 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
673 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
674 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
675 c = ci->cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
676 cr = (struct mwCipher_RC2_128 *) c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
677 cir = (struct mwCipherInstance_RC2_128 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
678 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
679 mp_init(&remote_key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
680 mp_init(&shared); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
681 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
682 mwDHImportKey(&remote_key, &item->info); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
683 mwDHCalculateShared(&shared, &remote_key, &cr->private_key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
684 mwDHExportKey(&shared, &sho); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
685 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
686 /* 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
|
687 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
|
688 /* 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
|
689 hypothetically start with 8bits or more unset, meaning the |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
690 exported key might be less than 64 bytes in length */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
691 mwKeyExpand(cir->shared, sho.data+(sho.len-16), 16); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
692 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
693 mp_clear(&remote_key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
694 mp_clear(&shared); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
695 mwOpaque_clear(&sho); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
696 } |
|
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 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
700 offer_RC2_128(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
701 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
702 struct mwCipher *c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
703 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
704 struct mwEncryptItem *ei; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
705 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
706 c = ci->cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
707 cr = (struct mwCipher_RC2_128 *) c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
708 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
709 ei = g_new0(struct mwEncryptItem, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
710 ei->id = mwCipher_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
711 mwOpaque_clone(&ei->info, &cr->public_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
712 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
713 return ei; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
714 } |
|
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 static void accepted_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
718 struct mwEncryptItem *item) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
719 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
720 return offered_RC2_128(ci, item); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
721 } |
|
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 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
725 accept_RC2_128(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
726 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
727 return offer_RC2_128(ci); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
728 } |
|
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 static int encrypt_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
732 struct mwOpaque *data) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
733 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
734 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
735 struct mwOpaque o = { 0, 0 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
736 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
737 cir = (struct mwCipherInstance_RC2_128 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
738 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
739 mwEncryptExpanded(cir->shared, cir->outgoing_iv, data, &o); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
740 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
741 mwOpaque_clear(data); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
742 data->data = o.data; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
743 data->len = o.len; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
744 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
745 return 0; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
746 } |
|
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 static int decrypt_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
750 struct mwOpaque *data) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
751 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
752 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
753 struct mwOpaque o = { 0, 0 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
754 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
755 cir = (struct mwCipherInstance_RC2_128 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
756 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
757 mwDecryptExpanded(cir->shared, cir->incoming_iv, data, &o); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
758 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
759 mwOpaque_clear(data); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
760 data->data = o.data; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
761 data->len = o.len; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
762 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
763 return 0; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
764 } |
|
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 static void clear_RC2_128(struct mwCipher *c) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
768 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
769 cr = (struct mwCipher_RC2_128 *) c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
770 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
771 mp_clear(&cr->private_key); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
772 mwOpaque_clear(&cr->public_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
773 } |
|
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 struct mwCipher *mwCipher_new_RC2_128(struct mwSession *s) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
777 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
778 struct mwCipher *c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
779 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
780 mp_int pubkey; |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
781 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
782 cr = g_new0(struct mwCipher_RC2_128, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
783 c = &cr->cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
784 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
785 c->session = s; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
786 c->type = mwCipher_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
787 c->get_name = get_name_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
788 c->get_desc = get_desc_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
789 c->new_instance = new_instance_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
790 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
791 c->offered = offered_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
792 c->offer = offer_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
793 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
794 c->accepted = accepted_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
795 c->accept = accept_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
796 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
797 c->encrypt = encrypt_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
798 c->decrypt = decrypt_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
799 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
800 c->clear = clear_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
801 |
|
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
802 mp_init(&cr->private_key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
803 mp_init(&pubkey); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
804 mwDHRandKeypair(&cr->private_key, &pubkey); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
805 mwDHExportKey(&pubkey, &cr->public_key); |
|
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
806 mp_clear(&pubkey); |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
807 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
808 return c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
809 } |
|
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 |
| 10969 | 812 struct mwSession *mwCipher_getSession(struct mwCipher *cipher) { |
| 813 g_return_val_if_fail(cipher != NULL, NULL); | |
| 814 return cipher->session; | |
| 815 } | |
| 816 | |
| 817 | |
| 818 guint16 mwCipher_getType(struct mwCipher *cipher) { | |
| 819 /* 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
|
820 zero a real cipher id? */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
821 g_return_val_if_fail(cipher != NULL, 0xffff); |
| 10969 | 822 return cipher->type; |
| 823 } | |
| 824 | |
| 825 | |
| 826 const char *mwCipher_getName(struct mwCipher *cipher) { | |
| 827 g_return_val_if_fail(cipher != NULL, NULL); | |
| 828 g_return_val_if_fail(cipher->get_name != NULL, NULL); | |
| 829 return cipher->get_name(); | |
| 830 } | |
| 831 | |
| 832 | |
| 833 const char *mwCipher_getDesc(struct mwCipher *cipher) { | |
| 834 g_return_val_if_fail(cipher != NULL, NULL); | |
| 835 g_return_val_if_fail(cipher->get_desc != NULL, NULL); | |
| 836 return cipher->get_desc(); | |
| 837 } | |
| 838 | |
| 839 | |
| 840 void mwCipher_free(struct mwCipher *cipher) { | |
| 841 if(! cipher) return; | |
| 842 | |
| 843 if(cipher->clear) | |
| 844 cipher->clear(cipher); | |
| 845 | |
| 846 g_free(cipher); | |
| 847 } | |
| 848 | |
| 849 | |
| 850 struct mwCipherInstance *mwCipher_newInstance(struct mwCipher *cipher, | |
| 851 struct mwChannel *chan) { | |
| 852 g_return_val_if_fail(cipher != NULL, NULL); | |
| 853 g_return_val_if_fail(chan != NULL, NULL); | |
| 854 g_return_val_if_fail(cipher->new_instance != NULL, NULL); | |
| 855 return cipher->new_instance(cipher, chan); | |
| 856 } | |
| 857 | |
| 858 | |
| 859 struct mwCipher *mwCipherInstance_getCipher(struct mwCipherInstance *ci) { | |
| 860 g_return_val_if_fail(ci != NULL, NULL); | |
| 861 return ci->cipher; | |
| 862 } | |
| 863 | |
| 864 | |
| 865 struct mwChannel *mwCipherInstance_getChannel(struct mwCipherInstance *ci) { | |
| 866 g_return_val_if_fail(ci != NULL, NULL); | |
| 867 return ci->channel; | |
| 868 } | |
| 869 | |
| 870 | |
| 871 void mwCipherInstance_offered(struct mwCipherInstance *ci, | |
| 872 struct mwEncryptItem *item) { | |
| 873 struct mwCipher *cipher; | |
| 874 | |
| 875 g_return_if_fail(ci != NULL); | |
| 876 | |
| 877 cipher = ci->cipher; | |
| 878 g_return_if_fail(cipher != NULL); | |
| 879 | |
| 880 if(cipher->offered) cipher->offered(ci, item); | |
| 881 } | |
| 882 | |
| 883 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
884 struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
885 mwCipherInstance_offer(struct mwCipherInstance *ci) { |
| 10969 | 886 struct mwCipher *cipher; |
| 887 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
888 g_return_val_if_fail(ci != NULL, NULL); |
| 10969 | 889 |
| 890 cipher = ci->cipher; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
891 g_return_val_if_fail(cipher != NULL, NULL); |
| 10969 | 892 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
893 return cipher->offer(ci); |
| 10969 | 894 } |
| 895 | |
| 896 | |
| 897 void mwCipherInstance_accepted(struct mwCipherInstance *ci, | |
| 898 struct mwEncryptItem *item) { | |
| 899 struct mwCipher *cipher; | |
| 900 | |
| 901 g_return_if_fail(ci != NULL); | |
| 902 | |
| 903 cipher = ci->cipher; | |
| 904 g_return_if_fail(cipher != NULL); | |
| 905 | |
| 906 if(cipher->accepted) cipher->accepted(ci, item); | |
| 907 } | |
| 908 | |
| 909 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
910 struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
911 mwCipherInstance_accept(struct mwCipherInstance *ci) { |
| 10969 | 912 struct mwCipher *cipher; |
| 913 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
914 g_return_val_if_fail(ci != NULL, NULL); |
| 10969 | 915 |
| 916 cipher = ci->cipher; | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
917 g_return_val_if_fail(cipher != NULL, NULL); |
| 10969 | 918 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
919 return cipher->accept(ci); |
| 10969 | 920 } |
| 921 | |
| 922 | |
| 923 int mwCipherInstance_encrypt(struct mwCipherInstance *ci, | |
| 924 struct mwOpaque *data) { | |
| 925 struct mwCipher *cipher; | |
| 926 | |
| 927 g_return_val_if_fail(data != NULL, 0); | |
| 928 | |
| 929 if(! ci) return 0; | |
| 930 cipher = ci->cipher; | |
| 931 | |
| 932 g_return_val_if_fail(cipher != NULL, -1); | |
| 933 | |
| 934 return (cipher->encrypt)? | |
| 935 cipher->encrypt(ci, data): 0; | |
| 936 } | |
| 937 | |
| 938 | |
| 939 int mwCipherInstance_decrypt(struct mwCipherInstance *ci, | |
| 940 struct mwOpaque *data) { | |
| 941 struct mwCipher *cipher; | |
| 942 | |
| 943 g_return_val_if_fail(data != NULL, 0); | |
| 944 | |
| 945 if(! ci) return 0; | |
| 946 cipher = ci->cipher; | |
| 947 | |
| 948 g_return_val_if_fail(cipher != NULL, -1); | |
| 949 | |
| 950 return (cipher->decrypt)? | |
| 951 cipher->decrypt(ci, data): 0; | |
| 952 } | |
| 953 | |
| 954 | |
| 955 void mwCipherInstance_free(struct mwCipherInstance *ci) { | |
| 956 struct mwCipher *cipher; | |
| 957 | |
| 958 if(! ci) return; | |
| 959 | |
| 960 cipher = ci->cipher; | |
| 961 | |
| 962 if(cipher && cipher->clear_instance) | |
| 963 cipher->clear_instance(ci); | |
| 964 | |
| 965 g_free(ci); | |
| 966 } | |
| 967 |
