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