Mercurial > pidgin
annotate src/protocols/sametime/meanwhile/mw_cipher.h @ 12323:fc464a0abccc
[gaim-migrate @ 14627]
Function prototypes need to be of the form foo(void); instead of foo(); for function that don't take any arguments. This allows the compiler to detect mistakes were someone passes arguments to such a function.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Sun, 04 Dec 2005 18:19:56 +0000 |
parents | a2ebf585d8c6 |
children |
rev | line source |
---|---|
10969 | 1 |
2 /* | |
3 Meanwhile - Unofficial Lotus Sametime Community Client Library | |
4 Copyright (C) 2004 Christopher (siege) O'Brien | |
5 | |
6 This library is free software; you can redistribute it and/or | |
7 modify it under the terms of the GNU Library General Public | |
8 License as published by the Free Software Foundation; either | |
9 version 2 of the License, or (at your option) any later version. | |
10 | |
11 This library is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 Library General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU Library General Public | |
17 License along with this library; if not, write to the Free | |
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 */ | |
20 | |
21 #ifndef _MW_CIPHER_H | |
22 #define _MW_CIPHER_H | |
23 | |
24 | |
25 #include <glib.h> | |
26 #include "mw_common.h" | |
27 | |
28 | |
29 /* place-holders */ | |
30 struct mwChannel; | |
31 struct mwSession; | |
32 | |
33 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
34 /** @enum mwCipherType |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
35 Common cipher types */ |
10969 | 36 enum mwCipherType { |
37 mwCipher_RC2_40 = 0x0000, | |
38 mwCipher_RC2_128 = 0x0001, | |
39 }; | |
40 | |
41 | |
42 struct mwCipher; | |
43 struct mwCipherInstance; | |
44 | |
45 | |
46 /** Obtain an instance of a given cipher, which can be used for the | |
47 processing of a single channel. */ | |
48 typedef struct mwCipherInstance *(*mwCipherInstantiator) | |
49 (struct mwCipher *cipher, struct mwChannel *chan); | |
50 | |
51 | |
52 /** Generate a descriptor for use in a channel create message to | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
53 indicate the availability of this cipher |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
54 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
55 @todo remove for 1.0 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
56 */ |
10969 | 57 typedef struct mwEncryptItem *(*mwCipherDescriptor) |
58 (struct mwCipherInstance *instance); | |
59 | |
60 | |
61 /** Process (encrypt or decrypt, depending) the given data. The passed | |
62 buffer may be freed in processing and be replaced with a freshly | |
63 allocated buffer. The post-processed buffer must in turn be freed | |
64 after use */ | |
65 typedef int (*mwCipherProcessor) | |
66 (struct mwCipherInstance *ci, struct mwOpaque *data); | |
67 | |
68 | |
69 /** A cipher. Ciphers are primarily used to provide cipher instances | |
70 for bi-directional encryption on channels, but some may be used | |
71 for other activities. Expand upon this structure to create a | |
72 custom encryption provider. | |
73 @see mwCipherInstance */ | |
74 struct mwCipher { | |
75 | |
76 /** service this cipher is providing for | |
77 @see mwCipher_getSession */ | |
78 struct mwSession *session; | |
79 | |
80 guint16 type; /**< @see mwCipher_getType */ | |
12323
fc464a0abccc
[gaim-migrate @ 14627]
Richard Laager <rlaager@wiktel.com>
parents:
12311
diff
changeset
|
81 const char *(*get_name)(void); /**< @see mwCipher_getName */ |
fc464a0abccc
[gaim-migrate @ 14627]
Richard Laager <rlaager@wiktel.com>
parents:
12311
diff
changeset
|
82 const char *(*get_desc)(void); /**< @see mwCipher_getDesc */ |
10969 | 83 |
84 /** Generate a new Cipher Instance for use on a channel | |
85 @see mwCipher_newInstance */ | |
86 mwCipherInstantiator new_instance; | |
87 | |
88 void (*offered)(struct mwCipherInstance *ci, struct mwEncryptItem *item); | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
89 struct mwEncryptItem *(*offer)(struct mwCipherInstance *ci); |
10969 | 90 void (*accepted)(struct mwCipherInstance *ci, struct mwEncryptItem *item); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
91 struct mwEncryptItem *(*accept)(struct mwCipherInstance *ci); |
10969 | 92 |
93 mwCipherProcessor encrypt; /**< @see mwCipherInstance_encrypt */ | |
94 mwCipherProcessor decrypt; /**< @see mwCipherInstance_decrypt */ | |
95 | |
96 /** prepare this cipher for being free'd | |
97 @see mwCipher_free */ | |
98 void (*clear)(struct mwCipher *c); | |
99 | |
100 /** clean up a cipher instance before being free'd | |
101 @see mwCipherInstance_free */ | |
102 void (*clear_instance)(struct mwCipherInstance *ci); | |
103 }; | |
104 | |
105 | |
106 /** An instance of a cipher. Expand upon this structure to contain | |
107 necessary state data | |
108 @see mwCipher */ | |
109 struct mwCipherInstance { | |
110 | |
111 /** the parent cipher. | |
112 @see mwCipherInstance_getCipher */ | |
113 struct mwCipher *cipher; | |
114 | |
115 /** the channel this instances processes | |
116 @see mwCipherInstance_getChannel */ | |
117 struct mwChannel *channel; | |
118 }; | |
119 | |
120 | |
121 struct mwCipher *mwCipher_new_RC2_40(struct mwSession *s); | |
122 | |
123 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
124 struct mwCipher *mwCipher_new_RC2_128(struct mwSession *s); |
10969 | 125 |
126 | |
127 struct mwSession *mwCipher_getSession(struct mwCipher *cipher); | |
128 | |
129 | |
130 guint16 mwCipher_getType(struct mwCipher *cipher); | |
131 | |
132 | |
133 const char *mwCipher_getName(struct mwCipher *cipher); | |
134 | |
135 | |
136 const char *mwCipher_getDesc(struct mwCipher *cipher); | |
137 | |
138 | |
139 struct mwCipherInstance *mwCipher_newInstance(struct mwCipher *cipher, | |
140 struct mwChannel *channel); | |
141 | |
142 | |
143 /** destroy a cipher */ | |
144 void mwCipher_free(struct mwCipher* cipher); | |
145 | |
146 | |
147 /** reference the parent cipher of an instance */ | |
148 struct mwCipher *mwCipherInstance_getCipher(struct mwCipherInstance *ci); | |
149 | |
150 | |
151 /** Indicates a cipher has been offered to our channel */ | |
152 void mwCipherInstance_offered(struct mwCipherInstance *ci, | |
153 struct mwEncryptItem *item); | |
154 | |
155 | |
156 /** Offer a cipher */ | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
157 struct mwEncryptItem * |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
158 mwCipherInstance_offer(struct mwCipherInstance *ci); |
10969 | 159 |
160 | |
161 /** Indicates an offered cipher has been accepted */ | |
162 void mwCipherInstance_accepted(struct mwCipherInstance *ci, | |
163 struct mwEncryptItem *item); | |
164 | |
165 | |
166 /** Accept a cipher offered to our channel */ | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
167 struct mwEncryptItem * |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
168 mwCipherInstance_accept(struct mwCipherInstance *ci); |
10969 | 169 |
170 | |
171 /** encrypt data */ | |
172 int mwCipherInstance_encrypt(struct mwCipherInstance *ci, | |
173 struct mwOpaque *data); | |
174 | |
175 | |
176 /** decrypt data */ | |
177 int mwCipherInstance_decrypt(struct mwCipherInstance *ci, | |
178 struct mwOpaque *data); | |
179 | |
180 | |
181 /** destroy a cipher instance */ | |
182 void mwCipherInstance_free(struct mwCipherInstance *ci); | |
183 | |
184 | |
185 /** | |
186 @section General Cipher Functions | |
187 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
188 These functions are reused where encryption is necessary outside of |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
189 a channel (eg. session authentication) |
10969 | 190 */ |
191 /* @{ */ | |
192 | |
193 | |
194 /** generate some pseudo-random bytes | |
195 @param keylen count of bytes to write into key | |
196 @param key buffer to write keys into | |
197 */ | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
198 void mwKeyRandom(guchar *key, gsize keylen); |
10969 | 199 |
200 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
201 /** Setup an Initialization Vector. IV must be at least 8 bytes */ |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
202 void mwIV_init(guchar *iv); |
10969 | 203 |
204 | |
205 /** Expand a variable-length key into a 128-byte key (represented as | |
206 an an array of 64 ints) */ | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
207 void mwKeyExpand(int *ekey, const guchar *key, gsize keylen); |
10969 | 208 |
209 | |
210 /** Encrypt data using an already-expanded key */ | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
211 void mwEncryptExpanded(const int *ekey, guchar *iv, |
10969 | 212 struct mwOpaque *in, |
213 struct mwOpaque *out); | |
214 | |
215 | |
216 /** Encrypt data using an expanded form of the given key */ | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
217 void mwEncrypt(const guchar *key, gsize keylen, guchar *iv, |
10969 | 218 struct mwOpaque *in, struct mwOpaque *out); |
219 | |
220 | |
221 /** Decrypt data using an already expanded key */ | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
222 void mwDecryptExpanded(const int *ekey, guchar *iv, |
10969 | 223 struct mwOpaque *in, |
224 struct mwOpaque *out); | |
225 | |
226 | |
227 /** Decrypt data using an expanded form of the given key */ | |
12311
a2ebf585d8c6
[gaim-migrate @ 14615]
Christopher O'Brien <siege@pidgin.im>
parents:
12261
diff
changeset
|
228 void mwDecrypt(const guchar *key, gsize keylen, guchar *iv, |
10969 | 229 struct mwOpaque *in, struct mwOpaque *out); |
230 | |
231 | |
232 /* @} */ | |
233 | |
234 | |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
235 /** |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
236 @section Diffie-Hellman Functions |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
237 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
238 These functions are reused where DH Key negotiation is necessary |
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
239 outside of a channel (eg. session authentication). These are |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
240 wrapping a full multiple-precision integer math library, but most of |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
241 the functionality there-of is not exposed. Currently, the math is |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
242 provided by a copy of the public domain libmpi. |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
243 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
244 for more information on the used MPI Library, visit |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
245 http://www.cs.dartmouth.edu/~sting/mpi/ |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
246 */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
247 /* @{ */ |
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
248 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
249 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
250 /** @struct mwMpi */ |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
251 struct mwMpi; |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
252 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
253 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
254 /** prepare a new mpi value */ |
12323
fc464a0abccc
[gaim-migrate @ 14627]
Richard Laager <rlaager@wiktel.com>
parents:
12311
diff
changeset
|
255 struct mwMpi *mwMpi_new(void); |
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
256 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
257 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
258 /** destroy an mpi value */ |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
259 void mwMpi_free(struct mwMpi *i); |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
260 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
261 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
262 /** Import a value from an opaque */ |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
263 void mwMpi_import(struct mwMpi *i, struct mwOpaque *o); |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
264 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
265 |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
266 /** Export a value into an opaque */ |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
267 void mwMpi_export(struct mwMpi *i, struct mwOpaque *o); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
268 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
269 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
270 /** initialize and set a big integer to the Sametime Prime value */ |
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
271 void mwMpi_setDHPrime(struct mwMpi *i); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
272 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
273 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
274 /** initialize and set a big integer to the Sametime Base value */ |
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
275 void mwMpi_setDHBase(struct mwMpi *i); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
276 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
277 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
278 /** sets private to a randomly generated value, and calculates public |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
279 using the Sametime Prime and Base */ |
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
280 void mwMpi_randDHKeypair(struct mwMpi *private, struct mwMpi *public); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
281 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
282 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
283 /** sets the shared key value based on the remote and private keys, |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
284 using the Sametime Prime and Base */ |
12261
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
285 void mwMpi_calculateDHShared(struct mwMpi *shared, struct mwMpi *remote, |
2edf5dc1b2ea
[gaim-migrate @ 14563]
Christopher O'Brien <siege@pidgin.im>
parents:
11943
diff
changeset
|
286 struct mwMpi *private); |
11943
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
287 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
288 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
289 /* @} */ |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
290 |
0110fc7c6a8a
[gaim-migrate @ 14234]
Christopher O'Brien <siege@pidgin.im>
parents:
10969
diff
changeset
|
291 |
10969 | 292 #endif |
293 | |
294 |