/[rdesktop]/sourceforge.net/trunk/rdesktop/licence.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/licence.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 39 by matthewc, Fri Apr 5 07:57:43 2002 UTC revision 190 by matthewc, Tue Sep 24 07:33:17 2002 UTC
# Line 7  Line 7 
7     it under the terms of the GNU General Public License as published by     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     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.     (at your option) any later version.
10      
11     This program is distributed in the hope that it will be useful,     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# Line 32  BOOL licence_issued = False; Line 32  BOOL licence_issued = False;
32    
33  /* Generate a session key and RC4 keys, given client and server randoms */  /* Generate a session key and RC4 keys, given client and server randoms */
34  static void  static void
35  licence_generate_keys(uint8 *client_key, uint8 *server_key, uint8 *client_rsa)  licence_generate_keys(uint8 * client_key, uint8 * server_key, uint8 * client_rsa)
36  {  {
37          uint8 session_key[48];          uint8 session_key[48];
38          uint8 temp_hash[48];          uint8 temp_hash[48];
# Line 49  licence_generate_keys(uint8 *client_key, Line 49  licence_generate_keys(uint8 *client_key,
49  }  }
50    
51  static void  static void
52  licence_generate_hwid(uint8 *hwid)  licence_generate_hwid(uint8 * hwid)
53  {  {
54          buf_out_uint32(hwid, 2);          buf_out_uint32(hwid, 2);
55          strncpy(hwid + 4, hostname, LICENCE_HWID_SIZE - 4);          strncpy((char *) (hwid + 4), hostname, LICENCE_HWID_SIZE - 4);
56  }  }
57    
58    #ifdef SAVE_LICENCE
59  /* Present an existing licence to the server */  /* Present an existing licence to the server */
60  static void  static void
61  licence_present(uint8 *client_random, uint8 *rsa_data,  licence_present(uint8 * client_random, uint8 * rsa_data,
62                  uint8 *licence_data, int licence_size,                  uint8 * licence_data, int licence_size, uint8 * hwid, uint8 * signature)
                 uint8 *hwid, uint8 *signature)  
63  {  {
64          uint32 sec_flags = SEC_LICENCE_NEG;          uint32 sec_flags = SEC_LICENCE_NEG;
65          uint16 length = 16 + SEC_RANDOM_SIZE + SEC_MODULUS_SIZE + SEC_PADDING_SIZE          uint16 length =
66                          + licence_size + LICENCE_HWID_SIZE + LICENCE_SIGNATURE_SIZE;                  16 + SEC_RANDOM_SIZE + SEC_MODULUS_SIZE + SEC_PADDING_SIZE +
67                    licence_size + LICENCE_HWID_SIZE + LICENCE_SIGNATURE_SIZE;
68          STREAM s;          STREAM s;
69    
70          s = sec_init(sec_flags, length + 4);          s = sec_init(sec_flags, length + 4);
# Line 94  licence_present(uint8 *client_random, ui Line 95  licence_present(uint8 *client_random, ui
95          s_mark_end(s);          s_mark_end(s);
96          sec_send(s, sec_flags);          sec_send(s, sec_flags);
97  }  }
98    #endif
99    
100  /* Send a licence request packet */  /* Send a licence request packet */
101  static void  static void
102  licence_send_request(uint8 *client_random, uint8 *rsa_data,  licence_send_request(uint8 * client_random, uint8 * rsa_data, char *user, char *host)
                      char *user, char *host)  
103  {  {
104          uint32 sec_flags = SEC_LICENCE_NEG;          uint32 sec_flags = SEC_LICENCE_NEG;
105          uint16 userlen = strlen(user) + 1;          uint16 userlen = strlen(user) + 1;
106          uint16 hostlen = strlen(host) + 1;          uint16 hostlen = strlen(host) + 1;
107          uint16 length = 120 + userlen + hostlen;          uint16 length = 128 + userlen + hostlen;
108          STREAM s;          STREAM s;
109    
110          s = sec_init(sec_flags, length + 2);          s = sec_init(sec_flags, length + 2);
# Line 138  static void Line 139  static void
139  licence_process_demand(STREAM s)  licence_process_demand(STREAM s)
140  {  {
141          uint8 null_data[SEC_MODULUS_SIZE];          uint8 null_data[SEC_MODULUS_SIZE];
         uint8 hwid[LICENCE_HWID_SIZE];  
         uint8 signature[LICENCE_SIGNATURE_SIZE];  
142          uint8 *server_random;          uint8 *server_random;
143    #ifdef SAVE_LICENCE
144            uint8 signature[LICENCE_SIGNATURE_SIZE];
145            uint8 hwid[LICENCE_HWID_SIZE];
146          uint8 *licence_data;          uint8 *licence_data;
147          int licence_size;          int licence_size;
148          RC4_KEY crypt_key;          RC4_KEY crypt_key;
149    #endif
150    
151          /* Retrieve the server random from the incoming packet */          /* Retrieve the server random from the incoming packet */
152          in_uint8p(s, server_random, SEC_RANDOM_SIZE);          in_uint8p(s, server_random, SEC_RANDOM_SIZE);
# Line 153  licence_process_demand(STREAM s) Line 156  licence_process_demand(STREAM s)
156          memset(null_data, 0, sizeof(null_data));          memset(null_data, 0, sizeof(null_data));
157          licence_generate_keys(null_data, server_random, null_data);          licence_generate_keys(null_data, server_random, null_data);
158    
159    #ifdef SAVE_LICENCE
160          licence_size = load_licence(&licence_data);          licence_size = load_licence(&licence_data);
161          if (licence_size == -1)          if (licence_size != -1)
162          {          {
163                  licence_send_request(null_data, null_data, username, hostname);                  /* Generate a signature for the HWID buffer */
164                    licence_generate_hwid(hwid);
165                    sec_sign(signature, 16, licence_sign_key, 16, hwid, sizeof(hwid));
166    
167                    /* Now encrypt the HWID */
168                    RC4_set_key(&crypt_key, 16, licence_key);
169                    RC4(&crypt_key, sizeof(hwid), hwid, hwid);
170    
171                    licence_present(null_data, null_data, licence_data, licence_size, hwid, signature);
172                    xfree(licence_data);
173                  return;                  return;
174          }          }
175    #endif
176    
177          /* Generate a signature for the HWID buffer */          licence_send_request(null_data, null_data, username, hostname);
         licence_generate_hwid(hwid);  
         sec_sign(signature, licence_sign_key, 16, hwid, sizeof(hwid));  
   
         /* Now encrypt the HWID */  
         RC4_set_key(&crypt_key, 16, licence_key);  
         RC4(&crypt_key, sizeof(hwid), hwid, hwid);  
   
         licence_present(null_data, null_data, licence_data, licence_size,  
                                         hwid, signature);  
         xfree(licence_data);  
178  }  }
179    
180  /* Send an authentication response packet */  /* Send an authentication response packet */
181  static void  static void
182  licence_send_authresp(uint8 *token, uint8 *crypt_hwid, uint8 *signature)  licence_send_authresp(uint8 * token, uint8 * crypt_hwid, uint8 * signature)
183  {  {
184          uint32 sec_flags = SEC_LICENCE_NEG;          uint32 sec_flags = SEC_LICENCE_NEG;
185          uint16 length = 58;          uint16 length = 58;
# Line 202  licence_send_authresp(uint8 *token, uint Line 206  licence_send_authresp(uint8 *token, uint
206    
207  /* Parse an authentication request packet */  /* Parse an authentication request packet */
208  static BOOL  static BOOL
209  licence_parse_authreq(STREAM s, uint8 **token, uint8 **signature)  licence_parse_authreq(STREAM s, uint8 ** token, uint8 ** signature)
210  {  {
211          uint16 tokenlen;          uint16 tokenlen;
212    
# Line 226  static void Line 230  static void
230  licence_process_authreq(STREAM s)  licence_process_authreq(STREAM s)
231  {  {
232          uint8 *in_token, *in_sig;          uint8 *in_token, *in_sig;
233          uint8 out_token[LICENCE_TOKEN_SIZE],          uint8 out_token[LICENCE_TOKEN_SIZE], decrypt_token[LICENCE_TOKEN_SIZE];
                 decrypt_token[LICENCE_TOKEN_SIZE];  
234          uint8 hwid[LICENCE_HWID_SIZE], crypt_hwid[LICENCE_HWID_SIZE];          uint8 hwid[LICENCE_HWID_SIZE], crypt_hwid[LICENCE_HWID_SIZE];
235          uint8 sealed_buffer[LICENCE_TOKEN_SIZE + LICENCE_HWID_SIZE];          uint8 sealed_buffer[LICENCE_TOKEN_SIZE + LICENCE_HWID_SIZE];
236          uint8 out_sig[LICENCE_SIGNATURE_SIZE];          uint8 out_sig[LICENCE_SIGNATURE_SIZE];
# Line 245  licence_process_authreq(STREAM s) Line 248  licence_process_authreq(STREAM s)
248          licence_generate_hwid(hwid);          licence_generate_hwid(hwid);
249          memcpy(sealed_buffer, decrypt_token, LICENCE_TOKEN_SIZE);          memcpy(sealed_buffer, decrypt_token, LICENCE_TOKEN_SIZE);
250          memcpy(sealed_buffer + LICENCE_TOKEN_SIZE, hwid, LICENCE_HWID_SIZE);          memcpy(sealed_buffer + LICENCE_TOKEN_SIZE, hwid, LICENCE_HWID_SIZE);
251          sec_sign(out_sig, licence_sign_key, 16,          sec_sign(out_sig, 16, licence_sign_key, 16, sealed_buffer, sizeof(sealed_buffer));
                  sealed_buffer, sizeof(sealed_buffer));  
252    
253          /* Deliberately break signature if licencing disabled */          /* Deliberately break signature if licencing disabled */
254          if (!licence)          if (!licence)
# Line 280  licence_process_issue(STREAM s) Line 282  licence_process_issue(STREAM s)
282                  return;                  return;
283    
284          licence_issued = True;          licence_issued = True;
285          save_licence(s->p, length-2);  
286    #ifdef SAVE_LICENCE
287            save_licence(s->p, length - 2);
288    #endif
289  }  }
290    
291  /* Process a licence packet */  /* Process a licence packet */

Legend:
Removed from v.39  
changed lines
  Added in v.190

  ViewVC Help
Powered by ViewVC 1.1.26