2 rdesktop: A Remote Desktop Protocol client.
3 RDP licensing negotiation
4 Copyright (C) Matthew Chapman 1999-2002
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program 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
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <openssl/rc4.h>
25 extern char g_username[16];
26 extern char hostname[16];
28 static uint8 g_licence_key[16];
29 static uint8 g_licence_sign_key[16];
31 BOOL g_licence_issued = False;
33 /* Generate a session key and RC4 keys, given client and server randoms */
35 licence_generate_keys(uint8 * client_key, uint8 * server_key, uint8 * client_rsa)
37 uint8 session_key[48];
40 /* Generate session key - two rounds of sec_hash_48 */
41 sec_hash_48(temp_hash, client_rsa, client_key, server_key, 65);
42 sec_hash_48(session_key, temp_hash, server_key, client_key, 65);
44 /* Store first 16 bytes of session key, for generating signatures */
45 memcpy(g_licence_sign_key, session_key, 16);
47 /* Generate RC4 key */
48 sec_hash_16(g_licence_key, &session_key[16], client_key, server_key);
53 printf("g_license_key:\n");
54 for (i = 0; i < 16; ++i)
55 printf(" 0x%02x", g_licence_key[i]);
58 printf("g_license_sign_key:\n");
59 for (i = 0; i < 16; ++i)
60 printf(" 0x%02x", g_licence_sign_key[i]);
66 unsigned char license_token[] = {
67 0x54, 0x00, 0x45, 0x00, 0x53, 0x00, 0x54, 0x00, 0x00, 0x00
74 uint8 in_token[LICENCE_TOKEN_SIZE], encrypt_token[LICENCE_TOKEN_SIZE];
75 uint8 signature[LICENCE_SIGNATURE_SIZE];
77 STREAM s = sec_init(38, SEC_LICENCE_NEG);
79 out_uint8(s, LICENCE_TAG_AUTHREQ);
80 out_uint8(s, 3); // version
81 out_uint16_le(s, 38); // length
84 out_uint16_le(s, 0xffff);
85 out_uint16_le(s, 0xffff);
86 out_uint16_le(s, 0x0000);
88 out_uint16_le(s, LICENCE_TOKEN_SIZE);
89 memcpy(in_token, license_token, LICENCE_TOKEN_SIZE);
92 RC4_set_key(&crypt_key, 16, g_licence_key);
93 RC4(&crypt_key, LICENCE_TOKEN_SIZE, in_token, encrypt_token);
95 out_uint8p(s, encrypt_token, LICENCE_TOKEN_SIZE);
97 // what are we supposed to sign here, really? guess at the
98 // token, nothing else has been sent...
99 sec_sign(signature, 16, g_licence_sign_key, 16, encrypt_token, LICENCE_TOKEN_SIZE);
100 out_uint8p(s, signature, LICENCE_SIGNATURE_SIZE);
103 sec_send(s, SEC_LICENCE_NEG);