Changeset 6227

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

Use MD5 method for logins.

Location:
trunk/licq
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • trunk/licq/include/licq_icq.h

    r6181 r6227  
    3838const unsigned short ICQ_SNACxFAM_LIST             = 0x0013; 
    3939const unsigned short ICQ_SNACxFAM_VARIOUS          = 0x0015; 
    40 const unsigned short ICQ_SNACxFAM_NEWUIN       = 0x0017; 
     40const unsigned short ICQ_SNACxFAM_AUTH             = 0x0017; 
    4141 
    4242// Subtypes for service family 
     
    101101// Subtypes for new uin family 
    102102const unsigned short ICQ_SNACxNEW_UIN_ERROR        = 0x0001; // server 
     103const unsigned short ICQ_SNACxAUTHxLOGON           = 0x0002; // client 
     104const unsigned short ICQ_SNACxAUTHxLOGON_REPLY     = 0x0003; // server 
    103105const unsigned short ICQ_SNACxREGISTER_USER        = 0x0004; // client 
    104106const unsigned short ICQ_SNACxNEW_UIN              = 0x0005; // server 
     107const unsigned short ICQ_SNACxAUTHxREQUEST_SALT    = 0x0006; // client 
     108const unsigned short ICQ_SNACxAUTHxSALT_REPLY      = 0x0007; // server 
    105109const unsigned short ICQ_SNACxREQUEST_IMAGE        = 0x000C; // client 
    106110const unsigned short ICQ_SNACxSEND_IMAGE           = 0x000D; // server 
  • trunk/licq/include/licq_icqd.h

    r6217 r6227  
    388388  unsigned long icqFetchAutoResponseServer(unsigned long); 
    389389  unsigned long icqLogon(unsigned short logonStatus); 
     390  unsigned long icqRequestLogonSalt(); 
    390391  unsigned long icqUserBasicInfo(const char *); 
    391392  unsigned long icqUserBasicInfo(unsigned long); 
     
    691692       m_bTCPEnabled, 
    692693       m_bFirewall, 
    693        m_bVerify; 
     694       m_bVerify, 
     695       // NeedSalt is to let the daemon know when to make a salt request, which 
     696       // should only happen when we first log on. After we get the credentials, we 
     697       // do another logon, but it doesn't need to get a salt. 
     698       m_bNeedSalt; 
    694699  time_t m_tLogonTime; 
    695700  char *m_szRegisterPasswd; 
     
    807812  void ProcessBOSFam(CBuffer&, unsigned short); 
    808813  void ProcessListFam(CBuffer &, unsigned short); 
    809   void ProcessNewUINFam(CBuffer &, unsigned short); 
     814  void ProcessAuthFam(CBuffer &, unsigned short); 
    810815 
    811816  void ProcessSystemMessage(CBuffer &packet, unsigned long checkUin, unsigned short newCommand, time_t timeSent); 
  • trunk/licq/include/licq_packets.h

    r6181 r6227  
    198198}; 
    199199 
     200class CPU_ConnectStart : public CSrvPacketTcp 
     201{ 
     202public: 
     203  CPU_ConnectStart(); 
     204}; 
     205 
    200206//-----Logon-------------------------------------------------------------------- 
    201207class CPU_Logon : public CSrvPacketTcp 
     
    242248                    unsigned short nService = 0); 
    243249  virtual ~CPU_GenericFamily(); 
     250}; 
     251 
     252class CPU_RequestLogonSalt : public CPU_CommonFamily 
     253{ 
     254public: 
     255  CPU_RequestLogonSalt(const std::string &); 
     256}; 
     257 
     258class CPU_NewLogon : public CPU_CommonFamily 
     259{ 
     260public: 
     261  CPU_NewLogon(const char *_szPassword, const char *_szUin, const char *_szMD5Salt); 
    244262}; 
    245263 
  • trunk/licq/src/icqd-srv.cpp

    r6217 r6227  
    17761776      case MAKESNAC(ICQ_SNACxFAM_BUDDY, ICQ_SNACxBDY_ADDxTOxLIST): 
    17771777      case MAKESNAC(ICQ_SNACxFAM_BUDDY, ICQ_SNACxBDY_REMOVExFROMxLIST): 
    1778       case MAKESNAC(ICQ_SNACxFAM_NEWUIN, ICQ_SNACxREGISTER_USER): 
     1778      case MAKESNAC(ICQ_SNACxFAM_AUTH, ICQ_SNACxREGISTER_USER): 
    17791779      case MAKESNAC(ICQ_SNACxFAM_LOCATION, ICQ_SNACxREQUESTxUSERxINFO): 
    17801780      case MAKESNAC(ICQ_SNACxFAM_LOCATION, ICQ_SNACxLOC_INFOxREQ): 
     
    18581858  } 
    18591859 
    1860   char *passwd = strdup(o->Password()); 
    1861   char *user = strdup(o->IdString()); 
    1862   unsigned long status = o->AddStatusFlags(logonStatus); 
     1860  m_nDesiredStatus = o->AddStatusFlags(logonStatus); 
    18631861  gUserManager.DropOwner(); 
    1864   CPU_Logon *p = new CPU_Logon(passwd, user, status); 
    1865   free(passwd); 
    1866   free(user); 
     1862 
     1863  CPU_ConnectStart *startPacket = new CPU_ConnectStart(); 
     1864  SendEvent_Server(startPacket); 
     1865 
    18671866  m_bOnlineNotifies = false; 
    1868   gLog.Info(tr("%sRequesting logon (#%hu)...\n"), L_SRVxSTR, p->Sequence()); 
    18691867  m_nServerSequence = 0; 
    1870   m_nDesiredStatus = status; 
    18711868  m_bLoggingOn = true; 
    18721869  m_tLogonTime = time(NULL); 
    1873  
    1874   SendEvent_Server(p); 
     1870  m_bNeedSalt = true; 
     1871 
     1872  return 0; 
     1873} 
     1874 
     1875unsigned long CICQDaemon::icqRequestLogonSalt() 
     1876{ 
     1877  if (m_bNeedSalt) 
     1878  { 
     1879    ICQOwner *o = gUserManager.FetchOwner(LICQ_PPID, LOCK_R); 
     1880    CPU_RequestLogonSalt *p =  new CPU_RequestLogonSalt(o->IdString()); 
     1881    gUserManager.DropOwner(); 
     1882    gLog.Info(tr("%sRequesting logon salt (#%hu)...\n"), L_SRVxSTR, p->Sequence()); 
     1883    SendEvent_Server(p); 
     1884  } 
    18751885 
    18761886  return 0; 
     
    22122222        m_bRegistering = false; 
    22132223      } 
     2224    } 
     2225    else if (m_bLoggingOn) 
     2226    { 
     2227      icqRequestLogonSalt(); 
    22142228    } 
    22152229    break; 
     
    61956209} 
    61966210 
    6197 //--------ProcessNewUINFam----------------------------------------------------- 
    6198 void CICQDaemon::ProcessNewUINFam(CBuffer &packet, unsigned short nSubtype) 
     6211//--------ProcessAuthFam---------------------------------------------------- 
     6212void CICQDaemon::ProcessAuthFam(CBuffer &packet, unsigned short nSubtype) 
    61996213{ 
    62006214  /*unsigned long Flags =*/ packet.UnpackUnsignedLongBE(); 
     
    62896303    } 
    62906304 
     6305    case ICQ_SNACxAUTHxSALT_REPLY: 
     6306    { 
     6307      char *md5Salt = packet.UnpackStringBE(); 
     6308      ICQOwner *o = gUserManager.FetchOwner(LICQ_PPID, LOCK_R); 
     6309      CPU_NewLogon *p = new CPU_NewLogon(o->Password(), o->IdString(), md5Salt); 
     6310      gUserManager.DropOwner(LICQ_PPID); 
     6311      gLog.Info(tr("%sSending md5 hashed password.\n"), L_SRVxSTR); 
     6312      SendEvent_Server(p); 
     6313      delete [] md5Salt; 
     6314      m_bNeedSalt = false; 
     6315      break; 
     6316    } 
     6317 
     6318    case ICQ_SNACxAUTHxLOGON_REPLY: 
     6319    { 
     6320      ProcessCloseChannel(packet); 
     6321      break; 
     6322    } 
     6323 
    62916324    case ICQ_SNACxSEND_IMAGE: 
    62926325    { 
     
    63776410    break; 
    63786411 
    6379   case ICQ_SNACxFAM_NEWUIN: 
    6380     ProcessNewUINFam(packet, nSubtype); 
     6412  case ICQ_SNACxFAM_AUTH: 
     6413    ProcessAuthFam(packet, nSubtype); 
    63816414    break; 
    63826415     
  • trunk/licq/src/icqd.cpp

    r6181 r6227  
    161161  m_bOnlineNotifies = true; 
    162162  m_bVerify = false; 
     163  m_bNeedSalt = true; 
    163164  m_szRegisterPasswd = 0; 
    164165  m_nRegisterThreadId = 0; 
  • 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]);