/[rdesktop]/sourceforge.net/trunk/rdesktop/secure.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/secure.c

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

revision 412 by forsberg, Fri Jun 6 11:07:46 2003 UTC revision 432 by matthewc, Tue Jul 1 09:31:25 2003 UTC
# Line 42  extern BOOL g_licence_issued; Line 42  extern BOOL g_licence_issued;
42  extern BOOL use_rdp5;  extern BOOL use_rdp5;
43  extern int server_bpp;  extern int server_bpp;
44  extern uint16 mcs_userid;  extern uint16 mcs_userid;
45    extern VCHANNEL g_channels[];
46    extern unsigned int g_num_channels;
47    
48  static int rc4_key_len;  static int rc4_key_len;
49  static RC4_KEY rc4_decrypt_key;  static RC4_KEY rc4_decrypt_key;
# Line 399  sec_establish_key(void) Line 401  sec_establish_key(void)
401  static void  static void
402  sec_out_mcs_data(STREAM s)  sec_out_mcs_data(STREAM s)
403  {  {
         uint16 num_channels = get_num_channels();  
404          int hostlen = 2 * strlen(hostname);          int hostlen = 2 * strlen(hostname);
405          int length = 158 + 76 + 12 + 4 + (CHANNEL_TAGDATA_SIZE * num_channels);          int length = 158 + 76 + 12 + 4;
406          uint16 i;          unsigned int i;
         rdp5_channel *channel;  
407    
408          if (0 < num_channels)          if (g_num_channels > 0)
409          {                  length += g_num_channels*12 + 8;
                 length += +4 + 4;  
         }  
410    
411          if (hostlen > 30)          if (hostlen > 30)
412                  hostlen = 30;                  hostlen = 30;
# Line 485  sec_out_mcs_data(STREAM s) Line 483  sec_out_mcs_data(STREAM s)
483          out_uint32_le(s, encryption ? 0x3 : 0); /* encryption supported, 128-bit supported */          out_uint32_le(s, encryption ? 0x3 : 0); /* encryption supported, 128-bit supported */
484          out_uint32(s, 0);       /* Unknown */          out_uint32(s, 0);       /* Unknown */
485    
486          DEBUG_RDP5(("num_channels is %d\n", num_channels));          DEBUG_RDP5(("g_num_channels is %d\n", g_num_channels));
487          if (0 < num_channels)          if (g_num_channels > 0)
488          {          {
489                  out_uint16_le(s, SEC_TAG_CLI_CHANNELS);                  out_uint16_le(s, SEC_TAG_CLI_CHANNELS);
490                  out_uint16_le(s, num_channels * CHANNEL_TAGDATA_SIZE + 4 + 4);  /* length */                  out_uint16_le(s, g_num_channels * 12 + 8);      /* length */
491                  out_uint32_le(s, num_channels); /* number of virtual channels */                  out_uint32_le(s, g_num_channels);       /* number of virtual channels */
492                  for (i = 0; i < num_channels; i++)                  for (i = 0; i < g_num_channels; i++)
493                  {                  {
494                          channel = find_channel_by_num(i);                          DEBUG_RDP5(("Requesting channel %s\n", g_channels[i].name));
495                          DEBUG_RDP5(("Requesting channel %s\n", channel->name));                          out_uint8a(s, g_channels[i].name, 8);
496                          out_uint8p(s, channel->name, 8);                          out_uint32_be(s, g_channels[i].flags);
                         out_uint32_be(s, channel->channelflags);  
497                  }                  }
498          }          }
499    
# Line 640  sec_parse_crypt_info(STREAM s, uint32 * Line 637  sec_parse_crypt_info(STREAM s, uint32 *
637                   */                   */
638    
639                  in_uint32_le(s, cacert_len);                  in_uint32_le(s, cacert_len);
640                    DEBUG_RDP5(("CA Certificate length is %d\n", cacert_len));
641                  cacert = d2i_X509(NULL, &(s->p), cacert_len);                  cacert = d2i_X509(NULL, &(s->p), cacert_len);
642                  /* Note: We don't need to move s->p here - d2i_X509 is                  /* Note: We don't need to move s->p here - d2i_X509 is
643                     "kind" enough to do it for us */                     "kind" enough to do it for us */
# Line 660  sec_parse_crypt_info(STREAM s, uint32 * Line 658  sec_parse_crypt_info(STREAM s, uint32 *
658                   */                   */
659    
660                  in_uint32_le(s, cert_len);                  in_uint32_le(s, cert_len);
661                    DEBUG_RDP5(("Certificate length is %d\n", cert_len));
662                  server_cert = d2i_X509(NULL, &(s->p), cert_len);                  server_cert = d2i_X509(NULL, &(s->p), cert_len);
663                  if (NULL == server_cert)                  if (NULL == server_cert)
664                  {                  {
# Line 739  sec_process_srv_info(STREAM s) Line 738  sec_process_srv_info(STREAM s)
738  {  {
739          in_uint16_le(s, server_rdp_version);          in_uint16_le(s, server_rdp_version);
740          DEBUG_RDP5(("Server RDP version is %d\n", server_rdp_version));          DEBUG_RDP5(("Server RDP version is %d\n", server_rdp_version));
741            if (1 == server_rdp_version)
742                    use_rdp5 = 0;
743  }  }
744    
745    
# Line 771  sec_process_mcs_data(STREAM s) Line 772  sec_process_mcs_data(STREAM s)
772                                  sec_process_srv_info(s);                                  sec_process_srv_info(s);
773                                  break;                                  break;
774    
                         case SEC_TAG_SRV_3:  
                                 break;  
   
775                          case SEC_TAG_SRV_CRYPT:                          case SEC_TAG_SRV_CRYPT:
776                                  sec_process_crypt_info(s);                                  sec_process_crypt_info(s);
777                                  break;                                  break;
778    
779                            case SEC_TAG_SRV_CHANNELS:
780                                    /* FIXME: We should parse this information and
781                                       use it to map RDP5 channels to MCS
782                                       channels */
783                                    break;
784    
785                          default:                          default:
786                                  unimpl("response tag 0x%x\n", tag);                                  unimpl("response tag 0x%x\n", tag);
787                  }                  }
# Line 800  sec_recv(void) Line 804  sec_recv(void)
804                  {                  {
805                          in_uint32_le(s, sec_flags);                          in_uint32_le(s, sec_flags);
806    
                         if (sec_flags & SEC_LICENCE_NEG)  
                         {  
                                 if (sec_flags & SEC_ENCRYPT)  
                                 {  
                                         DEBUG_RDP5(("Encrypted license detected\n"));  
                                 }  
                                 licence_process(s);  
                                 continue;  
                         }  
   
807                          if (sec_flags & SEC_ENCRYPT)                          if (sec_flags & SEC_ENCRYPT)
808                          {                          {
809                                  in_uint8s(s, 8);        /* signature */                                  in_uint8s(s, 8);        /* signature */
810                                  sec_decrypt(s->p, s->end - s->p);                                  sec_decrypt(s->p, s->end - s->p);
811                          }                          }
812    
813                            if (sec_flags & SEC_LICENCE_NEG)
814                            {
815                                    licence_process(s);
816                                    continue;
817                            }
818                  }                  }
819    
820                  if (MCS_GLOBAL_CHANNEL == channel)                  if (channel != MCS_GLOBAL_CHANNEL)
821                  {                  {
822                          return s;                          channel_process(s, channel);
823                            continue;
824                  }                  }
                 else  
                         rdp5_process_channel(s, channel);  
825    
826                    return s;
827          }          }
828    
829          return NULL;          return NULL;

Legend:
Removed from v.412  
changed lines
  Added in v.432

  ViewVC Help
Powered by ViewVC 1.1.26