Mercurial > pidgin
annotate libpurple/protocols/mxit/cipher.c @ 32819:2c6510167895 default tip
propagate from branch 'im.pidgin.pidgin.2.x.y' (head 3315c5dfbd0ad16511bdcf865e5b07c02d07df24)
to branch 'im.pidgin.pidgin' (head cbd1eda6bcbf0565ae7766396bb8f6f419cb6a9a)
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Sat, 02 Jun 2012 02:30:49 +0000 |
parents | f75041cb3fec |
children |
rev | line source |
---|---|
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
1 /* |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
2 * MXit Protocol libPurple Plugin |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
3 * |
31890 | 4 * -- encryption -- |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
5 * |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
6 * Pieter Loubser <libpurple@mxit.com> |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
7 * |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
8 * (C) Copyright 2009 MXit Lifestyle (Pty) Ltd. |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
9 * <http://www.mxitlifestyle.com> |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
10 * |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
11 * This program is free software; you can redistribute it and/or modify |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
12 * it under the terms of the GNU General Public License as published by |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
13 * the Free Software Foundation; either version 2 of the License, or |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
14 * (at your option) any later version. |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
15 * |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
16 * This program is distributed in the hope that it will be useful, |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
19 * GNU General Public License for more details. |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
20 * |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
21 * You should have received a copy of the GNU General Public License |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
22 * along with this program; if not, write to the Free Software |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
24 */ |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
25 |
28770
259bbfb423d4
Fix all the remaining files for which internal.h doesn't end up being the first include.
Paul Aurich <paul@darkrain42.org>
parents:
28526
diff
changeset
|
26 #include "internal.h" |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
27 #include "purple.h" |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
28 |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
29 #include "mxit.h" |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
30 #include "cipher.h" |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
31 #include "aes.h" |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
32 |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
33 |
31890 | 34 /* encryption */ |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
35 #define INITIAL_KEY "6170383452343567" |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
36 #define SECRET_HEADER "<mxit/>" |
31876
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
37 #define ENCRYPT_HEADER "<mxitencrypted ver=\"5.2\"/>" |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
38 |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
39 |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
40 /*------------------------------------------------------------------------ |
31889
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
41 * Add ISO10126 Padding to the data. |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
42 * |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
43 * @param data The data to pad. |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
44 */ |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
45 static void padding_add( GString* data ) |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
46 { |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
47 unsigned int blocks = ( data->len / 16 ) + 1; |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
48 unsigned int padding = ( blocks * 16 ) - data->len; |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
49 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
50 g_string_set_size( data, blocks * 16 ); |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
51 data->str[data->len - 1] = padding; |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
52 } |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
53 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
54 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
55 /*------------------------------------------------------------------------ |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
56 * Remove ISO10126 Padding from the data. |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
57 * |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
58 * @param data The data from which to remove padding. |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
59 */ |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
60 static void padding_remove( GString* data ) |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
61 { |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
62 unsigned int padding; |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
63 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
64 if ( data->len == 0 ) |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
65 return; |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
66 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
67 padding = data->str[data->len - 1]; |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
68 g_string_truncate( data, data->len - padding ); |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
69 } |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
70 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
71 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
72 /*------------------------------------------------------------------------ |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
73 * Generate the Transport-Layer crypto key. |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
74 * (Note: this function is not-thread safe) |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
75 * |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
76 * @param session The MXit Session object |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
77 * @return The transport-layer crypto key. |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
78 */ |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
79 static char* transport_layer_key( struct MXitSession* session ) |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
80 { |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
81 static char key[16 + 1]; |
32245
f75041cb3fec
Convert libpurple and protocol prpl's to use the purple_account_* accessor functions.
andrew.victor@mxit.com
parents:
31894
diff
changeset
|
82 const char* password = purple_account_get_password( session->acc ); |
f75041cb3fec
Convert libpurple and protocol prpl's to use the purple_account_* accessor functions.
andrew.victor@mxit.com
parents:
31894
diff
changeset
|
83 int passlen = strlen( password ); |
31889
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
84 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
85 /* initialize with initial key */ |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
86 g_strlcpy( key, INITIAL_KEY, sizeof( key ) ); |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
87 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
88 /* client key (8 bytes) */ |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
89 memcpy( key, session->clientkey, strlen( session->clientkey ) ); |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
90 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
91 /* add last 8 characters of the PIN (no padding if less characters) */ |
31890 | 92 if ( passlen <= 8 ) |
32245
f75041cb3fec
Convert libpurple and protocol prpl's to use the purple_account_* accessor functions.
andrew.victor@mxit.com
parents:
31894
diff
changeset
|
93 memcpy( key + 8, password, passlen ); |
31889
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
94 else |
32245
f75041cb3fec
Convert libpurple and protocol prpl's to use the purple_account_* accessor functions.
andrew.victor@mxit.com
parents:
31894
diff
changeset
|
95 memcpy( key + 8, password + ( passlen - 8 ), 8 ); |
31889
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
96 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
97 return key; |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
98 } |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
99 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
100 |
79e1479747cf
Refactor the transport-layer encryption and decryption.
andrew.victor@mxit.com
parents:
31888
diff
changeset
|
101 /*------------------------------------------------------------------------ |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
102 * Encrypt the user's cleartext password using the AES 128-bit (ECB) |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
103 * encryption algorithm. |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
104 * |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
105 * @param session The MXit session object |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
106 * @return The encrypted & encoded password. Must be g_free'd when no longer needed. |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
107 */ |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
108 char* mxit_encrypt_password( struct MXitSession* session ) |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
109 { |
31890 | 110 char key[16 + 1]; |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
111 char exkey[512]; |
31890 | 112 GString* pass = NULL; |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
113 char encrypted[64]; |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
114 char* base64; |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
115 int i; |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
116 |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
117 purple_debug_info( MXIT_PLUGIN_ID, "mxit_encrypt_password\n" ); |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
118 |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
119 memset( encrypted, 0x00, sizeof( encrypted ) ); |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
120 |
31894 | 121 /* build the AES encryption key */ |
31774
4ad2a0668687
Changed a strcpy in the mxit prpl to a bounds-checked g_strlcpy.
Ethan Blanton <elb@pidgin.im>
parents:
28770
diff
changeset
|
122 g_strlcpy( key, INITIAL_KEY, sizeof( key ) ); |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
123 memcpy( key, session->clientkey, strlen( session->clientkey ) ); |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
124 ExpandKey( (unsigned char*) key, (unsigned char*) exkey ); |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
125 |
31894 | 126 /* build the secret data to be encrypted: SECRET_HEADER + password */ |
127 pass = g_string_new( SECRET_HEADER ); | |
32245
f75041cb3fec
Convert libpurple and protocol prpl's to use the purple_account_* accessor functions.
andrew.victor@mxit.com
parents:
31894
diff
changeset
|
128 g_string_append( pass, purple_account_get_password( session->acc) ); |
31894 | 129 padding_add( pass ); /* add ISO10126 padding */ |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
130 |
31894 | 131 /* now encrypt the secret. we encrypt each block separately (ECB mode) */ |
132 for ( i = 0; i < pass->len; i += 16 ) | |
133 Encrypt( (unsigned char*) pass->str + i, (unsigned char*) exkey, (unsigned char*) encrypted + i ); | |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
134 |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
135 /* now base64 encode the encrypted password */ |
31890 | 136 base64 = purple_base64_encode( (unsigned char*) encrypted, pass->len ); |
137 | |
138 g_string_free( pass, TRUE ); | |
28526
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
139 |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
140 return base64; |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
141 } |
69aa4660401a
Initial addition of the MXit protocol plugin, provided by the MXit folks
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
diff
changeset
|
142 |
31876
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
143 |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
144 /*------------------------------------------------------------------------ |
31894 | 145 * Decrypt a message using transport-layer encryption. |
31876
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
146 * |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
147 * @param session The MXit session object |
31894 | 148 * @param message The encrypted message data (is base64-encoded). |
31876
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
149 * @return The decrypted message. Must be g_free'd when no longer needed. |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
150 */ |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
151 char* mxit_decrypt_message( struct MXitSession* session, char* message ) |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
152 { |
31894 | 153 guchar* raw_message; |
31892
a330d1187fa7
merge of 'abe467cd836e25b339d81461c056f6289d88b2f0'
pieter.loubser@mxit.com
parents:
31890
diff
changeset
|
154 gsize raw_len; |
31876
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
155 char exkey[512]; |
31894 | 156 GString* decoded = NULL; |
31892
a330d1187fa7
merge of 'abe467cd836e25b339d81461c056f6289d88b2f0'
pieter.loubser@mxit.com
parents:
31890
diff
changeset
|
157 int i; |
31876
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
158 |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
159 /* remove optional header: <mxitencrypted ver="5.2"/> */ |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
160 if ( strncmp( message, ENCRYPT_HEADER, strlen( ENCRYPT_HEADER ) ) == 0 ) |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
161 message += strlen( ENCRYPT_HEADER ); |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
162 |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
163 /* base64 decode the message */ |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
164 raw_message = purple_base64_decode( message, &raw_len ); |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
165 |
31894 | 166 /* build the AES key */ |
167 ExpandKey( (unsigned char*) transport_layer_key( session ), (unsigned char*) exkey ); | |
31876
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
168 |
31894 | 169 /* AES decrypt each block */ |
31876
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
170 decoded = g_string_sized_new( raw_len ); |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
171 for ( i = 0; i < raw_len; i += 16 ) { |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
172 char block[16]; |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
173 |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
174 Decrypt( (unsigned char*) raw_message + i, (unsigned char*) exkey, (unsigned char*) block ); |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
175 g_string_append_len( decoded, block, 16 ); |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
176 } |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
177 g_free( raw_message ); |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
178 |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
179 /* check that the decrypted message starts with header: <mxit/> */ |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
180 if ( strncmp( decoded->str, SECRET_HEADER, strlen( SECRET_HEADER ) != 0 ) ) { |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
181 g_string_free( decoded, TRUE ); |
31894 | 182 return NULL; /* message could not be decrypted */ |
31876
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
183 } |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
184 |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
185 /* remove ISO10126 padding */ |
31894 | 186 padding_remove( decoded ); |
187 | |
188 /* remove encryption header */ | |
189 g_string_erase( decoded, 0, strlen( SECRET_HEADER ) ); | |
31876
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
190 |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
191 return g_string_free( decoded, FALSE ); |
3951afa56940
Start implementing MXit secure messaging.
andrew.victor@mxit.com
parents:
28770
diff
changeset
|
192 } |
31894 | 193 |
194 | |
195 /*------------------------------------------------------------------------ | |
196 * Encrypt a message using transport-layer encryption. | |
197 * | |
198 * @param session The MXit session object | |
199 * @param message The message data. | |
200 * @return The encrypted message. Must be g_free'd when no longer needed. | |
201 */ | |
202 char* mxit_encrypt_message( struct MXitSession* session, char* message ) | |
203 { | |
204 GString* raw_message = NULL; | |
205 char exkey[512]; | |
206 GString* encoded = NULL; | |
207 gchar* base64; | |
208 int i; | |
209 | |
210 purple_debug_info( MXIT_PLUGIN_ID, "encrypt message: '%s'\n", message ); | |
211 | |
212 /* append encryption header to message data */ | |
213 raw_message = g_string_new( SECRET_HEADER ); | |
214 g_string_append( raw_message, message ); | |
215 padding_add( raw_message ); /* add ISO10126 padding */ | |
216 | |
217 /* build the AES key */ | |
218 ExpandKey( (unsigned char*) transport_layer_key( session ), (unsigned char*) exkey ); | |
219 | |
220 /* AES encrypt each block */ | |
221 encoded = g_string_sized_new( raw_message->len ); | |
222 for ( i = 0; i < raw_message->len; i += 16 ) { | |
223 char block[16]; | |
224 | |
225 Encrypt( (unsigned char*) raw_message->str + i, (unsigned char*) exkey, (unsigned char*) block ); | |
226 g_string_append_len( encoded, block, 16 ); | |
227 } | |
228 g_string_free( raw_message, TRUE ); | |
229 | |
230 /* base64 encode the encrypted message */ | |
231 base64 = purple_base64_encode( (unsigned char *) encoded->str, encoded->len ); | |
232 g_string_free( encoded, TRUE ); | |
233 | |
234 purple_debug_info( MXIT_PLUGIN_ID, "encrypted message: '%s'\n", base64 ); | |
235 | |
236 return base64; | |
237 } |