src/protocols/sametime/meanwhile/cipher.c

Wed, 02 Nov 2005 03:39:03 +0000

author
Christopher O'Brien <siege@pidgin.im>
date
Wed, 02 Nov 2005 03:39:03 +0000
changeset 11943
81ee4bc13c28
parent 10969
fa2093270b80
child 12261
672e2d392a73
permissions
-rw-r--r--

[gaim-migrate @ 14234]
Bringing things up to date with the last Meanwhile release, 0.5.0 and the last
gaim-meanwhile plugin release, 1.2.5 (which should be the last plugin release
against oldstatus, if all goes well with HEAD and no major bugs crop up)

It builds, so that's a start. The status bits that have been empty since the
first import of the sametime stuff are still empty, but I'm going to try and
fill those in tomorrow. I've decided to try and start using HEAD actively, to
encourage me to get this freaking prpl fully functional.

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

mercurial