Show
Ignore:
Timestamp:
06/02/08 00:14:42 (6 months ago)
Author:
emostar
Message:

Use MD5 method for logins.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/licq/src/icqpacket.cpp

    r6207 r6227  
    2323extern int errno; 
    2424#endif 
     25 
     26#include <openssl/md5.h> 
    2527 
    2628#include <boost/scoped_array.hpp> 
     
    713715 
    714716CPU_Register::CPU_Register(const char *szPasswd) 
    715     : CPU_CommonFamily(ICQ_SNACxFAM_NEWUIN, ICQ_SNACxREGISTER_USER) 
     717    : CPU_CommonFamily(ICQ_SNACxFAM_AUTH, ICQ_SNACxREGISTER_USER) 
    716718{ 
    717719  int nPassLen = strlen(szPasswd); 
     
    742744 
    743745CPU_VerifyRegistration::CPU_VerifyRegistration() 
    744   : CPU_CommonFamily(ICQ_SNACxFAM_NEWUIN, ICQ_SNACxREQUEST_IMAGE) 
     746  : CPU_CommonFamily(ICQ_SNACxFAM_AUTH, ICQ_SNACxREQUEST_IMAGE) 
    745747{ 
    746748  // Yes, it's empty 
     
    755757 
    756758CPU_SendVerification::CPU_SendVerification(const char *szPasswd, const char *szVerify) 
    757   : CPU_CommonFamily(ICQ_SNACxFAM_NEWUIN, ICQ_SNACxREGISTER_USER) 
     759  : CPU_CommonFamily(ICQ_SNACxFAM_AUTH, ICQ_SNACxREGISTER_USER) 
    758760{ 
    759761  int nPassLen = strlen(szPasswd); 
     
    786788} 
    787789 
     790CPU_ConnectStart::CPU_ConnectStart() 
     791  : CSrvPacketTcp(ICQ_CHNxNEW) 
     792{ 
     793  pthread_mutex_lock(&s_xMutex); 
     794  if (!s_bRegistered) { 
     795    s_nSequence[m_nService] = 0xffff; 
     796    s_bRegistered = true; 
     797  } 
     798  pthread_mutex_unlock(&s_xMutex); 
     799 
     800  m_nSize = 12; 
     801  InitBuffer(); 
     802 
     803  buffer->PackUnsignedLongBE(0x00000001); 
     804  buffer->PackUnsignedLongBE(0x80030004); 
     805  buffer->PackUnsignedLongBE(0x00100000); 
     806} 
     807 
     808CPU_RequestLogonSalt::CPU_RequestLogonSalt(const std::string &id) 
     809  : CPU_CommonFamily(ICQ_SNACxFAM_AUTH, ICQ_SNACxAUTHxREQUEST_SALT) 
     810{ 
     811  m_nSize += id.size() + 4; 
     812  InitBuffer(); 
     813 
     814  buffer->PackTLV(0x0001, id.size(), id.c_str()); 
     815} 
     816 
     817//-----NewLogon----------------------------------------------------------------- 
     818CPU_NewLogon::CPU_NewLogon(const char *szPassword, const char *szUin, const char *szMD5Salt) 
     819  : CPU_CommonFamily(ICQ_SNACxFAM_AUTH, ICQ_SNACxAUTHxLOGON) 
     820{ 
     821  // truncate password to MAX 8 characters 
     822  char szPass[MAX_LINE_LEN]; 
     823  if (strlen(szPassword) > 8) 
     824  { 
     825    gLog.Warn(tr("%sPassword too long, truncated to 8 Characters!\n"), L_WARNxSTR); 
     826    strncpy(szPass, szPassword, 8); 
     827    szPass[8] = '\0'; 
     828  } 
     829  else 
     830  { 
     831    strcpy(szPass, szPassword); 
     832  } 
     833 
     834  std::string toHash = szMD5Salt; 
     835  toHash += szPass; 
     836  toHash += "AOL Instant Messenger (SM)"; 
     837  unsigned char szDigest[16]; 
     838  MD5((const unsigned char *)toHash.c_str(), toHash.size(), szDigest); 
     839 
     840  unsigned int uinlen = strlen(szUin); 
     841  unsigned int digestlen = strlen(reinterpret_cast<char *>(szDigest)); 
     842 
     843  m_nSize += uinlen + digestlen + 70; 
     844  InitBuffer(); 
     845 
     846  buffer->PackTLV(0x0001, uinlen, szUin); 
     847  buffer->PackTLV(0x0025, digestlen, reinterpret_cast<char *>(szDigest)); 
     848 
     849  buffer->PackTLV(0x0003,  0x0008, "ICQBasic"); 
     850 
     851  // Static versioning 
     852  buffer->PackUnsignedLongBE(0x00160002); 
     853  buffer->PackUnsignedShortBE(0x010A); 
     854  // Client version major (4 == ICQ2000, 5 == ICQ2001) 
     855  buffer->PackUnsignedLongBE(0x00170002); 
     856  buffer->PackUnsignedShortBE(0x0014); 
     857  // Client version minor 
     858  buffer->PackUnsignedLongBE(0x00180002); 
     859  buffer->PackUnsignedShortBE(0x0022); 
     860  buffer->PackUnsignedLongBE(0x00190002); 
     861  buffer->PackUnsignedShortBE(0x0000); 
     862  // Client version build 
     863  buffer->PackUnsignedLongBE(0x001a0002); 
     864  buffer->PackUnsignedShortBE(0x0BB8); 
     865  buffer->PackUnsignedLongBE(0x00140004); 
     866  buffer->PackUnsignedLongBE(0x0000043D); 
     867 
     868  // locale info, just use english, usa for now, i don't know what else they use 
     869  buffer->PackTLV(0x000f, 0x0002, "en"); 
     870  buffer->PackTLV(0x000e, 0x0002, "us"); 
     871} 
     872 
    788873//-----Logon-------------------------------------------------------------------- 
    789874CPU_Logon::CPU_Logon(const char *szPassword, const char *szUin, unsigned short _nLogonStatus) 
     
    792877  // truncate password to MAX 8 characters 
    793878  char szPass[MAX_LINE_LEN]; 
    794   strcpy(szPass, szPassword); 
    795   if (strlen(szPass) > 8) 
     879  if (strlen(szPassword) > 8) 
    796880  { 
    797881    gLog.Warn(tr("%sPassword too long, truncated to 8 Characters!\n"), L_WARNxSTR); 
    798               szPass[8] = 0; 
    799   } 
     882    strncpy(szPass, szPassword, 8); 
     883  } 
     884  else 
     885  { 
     886    strcpy(szPass, szPassword); 
     887  } 
     888 
    800889  char szEncPass[16]; 
    801890  unsigned int j; 
     
    819908  // Encrypt our password here 
    820909  unsigned char xor_table[] = { 0xf3, 0x26, 0x81, 0xc4, 0x39, 0x86, 0xdb, 0x92, 
    821                 0x71, 0xa3, 0xb9, 0xe6, 0x53, 0x7a, 0x95, 0x7c}; 
     910                           0x71, 0xa3, 0xb9, 0xe6, 0x53, 0x7a, 0x95, 0x7c}; 
    822911  for (j = 0; j < pwlen; j++) 
    823912    szEncPass[j] = (szPass[j] ^ xor_table[j]);