Mercurial > pidgin
annotate src/protocols/sametime/meanwhile/cipher.c @ 11943:0110fc7c6a8a
[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.
committer: Tailor Script <tailor@pidgin.im>
| author | Christopher O'Brien <siege@pidgin.im> |
|---|---|
| date | Wed, 02 Nov 2005 03:39:03 +0000 |
| parents | 3ef77720e577 |
| 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 |
