Mercurial > pidgin
annotate src/protocols/sametime/meanwhile/cipher.c @ 12067:e859c1663a27
[gaim-migrate @ 14362]
Revert GtkSpell dynamic loading. A GtkSpell plugin is a better idea, and nosnilmot says he has one that's close to fully functional.
committer: Tailor Script <tailor@pidgin.im>
| author | Richard Laager <rlaager@wiktel.com> |
|---|---|
| date | Sun, 13 Nov 2005 01:44:11 +0000 |
| parents | 0110fc7c6a8a |
| children | 2edf5dc1b2ea |
| 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 <string.h> | |
| 23 #include <time.h> | |
| 24 | |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
25 #include <gmp.h> |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
26 |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
71 /** prime number used in DH exchange */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
72 static unsigned char dh_prime[] = { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
73 0xCF, 0x84, 0xAF, 0xCE, 0x86, 0xDD, 0xFA, 0x52, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
74 0x7F, 0x13, 0x6D, 0x10, 0x35, 0x75, 0x28, 0xEE, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
75 0xFB, 0xA0, 0xAF, 0xEF, 0x80, 0x8F, 0x29, 0x17, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
76 0x4E, 0x3B, 0x6A, 0x9E, 0x97, 0x00, 0x01, 0x71, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
77 0x7C, 0x8F, 0x10, 0x6C, 0x41, 0xC1, 0x61, 0xA6, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
78 0xCE, 0x91, 0x05, 0x7B, 0x34, 0xDA, 0x62, 0xCB, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
79 0xB8, 0x7B, 0xFD, 0xC1, 0xB3, 0x5C, 0x1B, 0x91, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
80 0x0F, 0xEA, 0x72, 0x24, 0x9D, 0x56, 0x6B, 0x9F |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
81 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
82 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
83 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
84 /** base used in DH exchange */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
85 #define DH_BASE 3 |
|
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 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
88 void mwInitDHPrime(mpz_t z) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
89 mpz_init(z); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
90 mpz_import(z, 64, 1, 1, 0, 0, dh_prime); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
91 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
92 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
93 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
94 void mwInitDHBase(mpz_t z) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
95 mpz_init_set_ui(z, DH_BASE); |
|
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 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
99 void mwDHRandKeypair(mpz_t private, mpz_t public) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
100 gmp_randstate_t rstate; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
101 mpz_t prime, base; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
102 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
103 mwInitDHPrime(prime); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
104 mwInitDHBase(base); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
105 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
106 gmp_randinit_default(rstate); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
107 mpz_urandomb(private, rstate, 512); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
108 mpz_powm(public, base, private, prime); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
109 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
110 mpz_clear(prime); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
111 mpz_clear(base); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
112 gmp_randclear(rstate); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
113 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
114 |
|
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 void mwDHCalculateShared(mpz_t shared, mpz_t remote, mpz_t private) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
117 mpz_t prime; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
118 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
119 mwInitDHPrime(prime); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
120 mpz_powm(shared, remote, private, prime); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
121 mpz_clear(prime); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
122 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
123 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
124 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
125 void mwDHImportKey(mpz_t key, struct mwOpaque *o) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
126 g_return_if_fail(o != NULL); |
|
0110fc7c6a8a
[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); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
128 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
129 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
130 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
131 void mwDHExportKey(mpz_t key, struct mwOpaque *o) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
132 gsize needed; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
133 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
134 g_return_if_fail(o != NULL); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
135 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
136 needed = (mpz_sizeinbase(key,2) + 7) / 8; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
137 o->len = 65; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
138 o->data = g_malloc0(o->len); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
139 |
|
0110fc7c6a8a
[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); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
141 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
142 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
143 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
144 void mwKeyRandom(char *key, gsize keylen) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
145 g_return_if_fail(key != NULL); |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
167 g_return_if_fail(keylen > 0); |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
171 |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
192 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
193 int a, b, c, d; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
194 int i, j; |
| 10969 | 195 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
196 a = (out[7] << 8) | (out[6] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
197 b = (out[5] << 8) | (out[4] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
198 c = (out[3] << 8) | (out[2] & 0xff); |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
281 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
282 int a, b, c, d; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
283 int i, j; |
| 10969 | 284 |
|
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
285 a = (out[7] << 8) | (out[6] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
286 b = (out[5] << 8) | (out[4] & 0xff); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
287 c = (out[3] << 8) | (out[2] & 0xff); |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
438 static struct mwCipherInstance * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
439 new_instance_RC2_40(struct mwCipher *cipher, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
440 struct mwChannel *chan) { |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
455 cir = g_new0(struct mwCipherInstance_RC2_40, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
456 ci = &cir->instance; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
457 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
458 ci->cipher = cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
459 ci->channel = chan; |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
469 struct mwEncryptItem *e; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
470 |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
477 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
478 offer_RC2_40(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
485 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
486 struct mwCipherInstance_RC2_40 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
487 struct mwLoginInfo *info; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
488 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
489 cir = (struct mwCipherInstance_RC2_40 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
490 info = mwChannel_getUser(ci->channel); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
491 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
492 if(info->login_id) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
493 mwKeyExpand(cir->incoming_key, info->login_id, 5); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
494 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
495 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
496 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
497 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
498 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
499 accept_RC2_40(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
500 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
501 accepted_RC2_40(ci, NULL); |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
515 |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
528 struct mwCipher_RC2_128 { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
529 struct mwCipher cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
530 mpz_t private_key; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
531 struct mwOpaque public_key; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
532 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
533 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
534 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
535 struct mwCipherInstance_RC2_128 { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
536 struct mwCipherInstance instance; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
537 int shared[64]; /* shared secret determined via DH exchange */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
538 char outgoing_iv[8]; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
539 char incoming_iv[8]; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
540 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
541 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
542 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
543 static const char *get_name_RC2_128() { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
544 return "RC2/128 Cipher"; |
|
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 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
547 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
548 static const char *get_desc_RC2_128() { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
549 return "RC2, DH shared secret key"; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
550 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
551 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
552 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
553 static struct mwCipherInstance * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
554 new_instance_RC2_128(struct mwCipher *cipher, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
555 struct mwChannel *chan) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
556 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
557 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
558 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
559 struct mwCipherInstance *ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
560 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
561 cr = (struct mwCipher_RC2_128 *) cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
562 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
563 cir = g_new0(struct mwCipherInstance_RC2_128, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
564 ci = &cir->instance; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
565 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
566 ci->cipher = cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
567 ci->channel = chan; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
568 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
569 mwIV_init(cir->incoming_iv); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
570 mwIV_init(cir->outgoing_iv); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
571 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
572 return ci; |
|
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 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
575 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
576 static void offered_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
577 struct mwEncryptItem *item) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
578 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
579 mpz_t remote_key; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
580 mpz_t shared; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
581 struct mwOpaque sho = { 0, 0 }; |
|
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 struct mwCipher *c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
584 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
585 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
586 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
587 c = ci->cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
588 cr = (struct mwCipher_RC2_128 *) c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
589 cir = (struct mwCipherInstance_RC2_128 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
590 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
591 mpz_init(remote_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
592 mpz_init(shared); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
593 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
594 mwDHImportKey(remote_key, &item->info); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
595 mwDHCalculateShared(shared, remote_key, cr->private_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
596 mwDHExportKey(shared, &sho); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
597 |
|
0110fc7c6a8a
[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 |
|
0110fc7c6a8a
[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. */ |
|
0110fc7c6a8a
[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 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
601 hypothetically start with 8bits or more unset, meaning the |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
602 exported key might be less than 64 bytes in length */ |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
603 mwKeyExpand(cir->shared, sho.data+(sho.len-16), 16); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
604 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
605 mpz_clear(remote_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
606 mpz_clear(shared); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
607 mwOpaque_clear(&sho); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
608 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
609 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
610 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
611 static struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
612 offer_RC2_128(struct mwCipherInstance *ci) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
613 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
614 struct mwCipher *c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
615 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
616 struct mwEncryptItem *ei; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
617 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
618 c = ci->cipher; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
619 cr = (struct mwCipher_RC2_128 *) c; |
|
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 ei = g_new0(struct mwEncryptItem, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
622 ei->id = mwCipher_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
623 mwOpaque_clone(&ei->info, &cr->public_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
624 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
625 return ei; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
626 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
627 |
|
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 static void accepted_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
630 struct mwEncryptItem *item) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
631 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
632 return offered_RC2_128(ci, item); |
|
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 struct mwEncryptItem * |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
637 accept_RC2_128(struct mwCipherInstance *ci) { |
|
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 return offer_RC2_128(ci); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
640 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
641 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
642 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
643 static int encrypt_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
644 struct mwOpaque *data) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
645 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
646 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
647 struct mwOpaque o = { 0, 0 }; |
|
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 cir = (struct mwCipherInstance_RC2_128 *) ci; |
|
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 mwEncryptExpanded(cir->shared, cir->outgoing_iv, data, &o); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
652 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
653 mwOpaque_clear(data); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
654 data->data = o.data; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
655 data->len = o.len; |
|
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 return 0; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
658 } |
|
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 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
661 static int decrypt_RC2_128(struct mwCipherInstance *ci, |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
662 struct mwOpaque *data) { |
|
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 struct mwCipherInstance_RC2_128 *cir; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
665 struct mwOpaque o = { 0, 0 }; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
666 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
667 cir = (struct mwCipherInstance_RC2_128 *) ci; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
668 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
669 mwDecryptExpanded(cir->shared, cir->incoming_iv, data, &o); |
|
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 mwOpaque_clear(data); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
672 data->data = o.data; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
673 data->len = o.len; |
|
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 return 0; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
676 } |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
677 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
678 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
679 static void clear_RC2_128(struct mwCipher *c) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
680 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
681 cr = (struct mwCipher_RC2_128 *) c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
682 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
683 mpz_clear(cr->private_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
684 mwOpaque_clear(&cr->public_key); |
|
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 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
687 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
688 struct mwCipher *mwCipher_new_RC2_128(struct mwSession *s) { |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
689 struct mwCipher_RC2_128 *cr; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
690 struct mwCipher *c; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
691 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
692 mpz_t pubkey; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
693 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
694 cr = g_new0(struct mwCipher_RC2_128, 1); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
695 c = &cr->cipher; |
|
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 c->session = s; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
698 c->type = mwCipher_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
699 c->get_name = get_name_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
700 c->get_desc = get_desc_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
701 c->new_instance = new_instance_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
702 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
703 c->offered = offered_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
704 c->offer = offer_RC2_128; |
|
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->accepted = accepted_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
707 c->accept = accept_RC2_128; |
|
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 c->encrypt = encrypt_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
710 c->decrypt = decrypt_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
711 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
712 c->clear = clear_RC2_128; |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
713 |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
714 mpz_init(cr->private_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
715 mpz_init(pubkey); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
716 mwDHRandKeypair(cr->private_key, pubkey); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
717 mwDHExportKey(pubkey, &cr->public_key); |
|
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
718 mpz_clear(pubkey); |
|
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 c; |
|
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 |
| 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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
732 zero a real cipher id? */ |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
809 struct mwEncryptItem * |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[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
0110fc7c6a8a
[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
0110fc7c6a8a
[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
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
835 struct mwEncryptItem * |
|
0110fc7c6a8a
[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
0110fc7c6a8a
[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
0110fc7c6a8a
[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
0110fc7c6a8a
[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 |
