Page 1 of 1

DC LockToKey

Posted: Sat Jun 03, 2006 7:22 am
by Joakim Christiansen
I will try to make a DC client, but I need help with creating a key:
http://www.dcpp.net/wiki/index.php/LockToKey
Would be nice if anyone add PB to that list :P

I played around...

Code: Select all

Procedure.s LockToKey(lock.s)
  len.l = Len(lock)
  Dim key.l(len) ; -1
  
  ;key(0) = ord(lock{0}) ^ ord(lock{len-1}) ^ ord(lock{len-2}) ^ 5
  key(0) = Asc(Mid(lock,1,1)) XOr Asc(Mid(lock,len-2,1)) XOr Asc(Mid(lock,len-3,1)) XOr 5
  
  For i=1 To len
    key(i) = ( Asc(Mid(lock,i+1,1)) XOr Asc(Mid(lock,i+1,1)) )
  Next
  
  For i=0 To len
    key(i) = ( (key(i)<<4) & 240) | ((key(i)>>4) & 15 )
  Next
  
  ;key = array_map('chr',key)
  
  Dim key2.s(len)
  
  For i=0 To len
    key2(i) = Chr(key(i))
  Next
  
  For i=0 To len
    Select key2(i)
      Case Chr(0)  : key2(i) = "/%DCN000%/"
      Case Chr(5)  : key2(i) = "/%DCN005%/"
      Case Chr(36) : key2(i) = "/%DCN036%/"
      Case Chr(96) : key2(i) = "/%DCN096%/"
      Case Chr(124): key2(i) = "/%DCN124%/"
      Case Chr(126): key2(i) = "/%DCN126%/"
    EndSelect
  Next
  
  ;key2 = implode('',key2)
  
  string.s
  
  For i=0 To Len
    string + key2(i)
  Next
  
  ProcedureReturn string
EndProcedure

MessageRequester("",LockToKey("EXTENDEDPROTOCOLABCABCABCABCABCABC")) ; Pk=DCPLUSPLUS0.242ABCABC"))

Posted: Sat Jun 03, 2006 8:35 am
by Dare
Here is a first attempt conversion of one of the VB routines:

Code: Select all

Procedure.s Lock2Key(StrLock.s)
  Protected TLock2Key.s
  Protected TChar.l
  Protected Result.s
  If Len(StrLock) < 3
    ProcedureReturn Left("BROKENCLIENT", Len(StrLock))
  EndIf
  TLock2Key = Chr( (Asc(Left(StrLock, 1)) ! Asc(Right(StrLock, 1))) ! (Asc(Mid(StrLock, Len(StrLock) - 1, 1)) ! 5))
  For i = 2 To Len(StrLock)
    TLock2Key = TLock2Key + Chr(Asc(Mid(StrLock, i, 1)) ! Asc(Mid(StrLock, i - 1, 1)) )
  Next i
  For i = 1 To Len(TLock2Key)
    TChar = Asc(Mid(TLock2Key, i, 1))
    TChar = (TChar * 16) + (TChar / 16)
    TChar = TChar % 256
    If TChar = 0 Or TChar = 5 Or TChar = 36 Or TChar = 96 Or TChar = 124 Or TChar = 126
      result + "/%DCN" + Right("000" + Str(TChar), 3) + "%/"
    Else
      result + Chr(TChar)
    EndIf
  Next
  ProcedureReturn result
EndProcedure

Debug Lock2Key("jqEXj)Y<aj6-[*Upz2yg+kXJhl?<a+n)@[=dT=SVQ8DV%K/Sbkl8KLV7(9")
Debug Lock2Key("EXTENDEDPROTOCOLABCABCABCABCABCABC")
I don't really have a clue what it is all about, though. :)

Is there someplace where there are a few examples of string in and key out values, to test against?

Eg: Lock = "123" gives key = "ABC"

Posted: Sat Jun 03, 2006 9:20 am
by Joakim Christiansen
Thank you Dare, i'll actually test this against a server when I get the time.
Is there someplace where there are a few examples of string in and key out values, to test against?
I'm not shure, i'll try to find some.

Posted: Sun Jun 04, 2006 4:18 am
by Joakim Christiansen

Code: Select all

EnableExplicit

Enumeration ;Windows
  #Main
EndEnumeration
Enumeration ;Gadgets
  #Main_Adress
  #Main_Debugger
  #Main_Connect
EndEnumeration

OpenWindow(#Main,#False,#False,600,400,"PureDC",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(#Main))
StringGadget(#Main_Adress,5,5,240,20,"battlestar.5star-net.com:1411")
ButtonGadget(#Main_Connect,250,5,55,20,"Connect")
EditorGadget(#Main_Debugger,5,30,300,200,#PB_Editor_ReadOnly)

Global WindowEvent.l, NetworkEvent.l, ServerID.l
Global BufferLength.l = 1000, *Buffer = AllocateMemory(BufferLength)

If InitNetwork() = #False
  MessageRequester("Warning!","Can't initialize network!",#MB_ICONWARNING)
  End
EndIf

Declare.s LockToKey(StrLock.s)
Procedure ConnectToServer()
  Protected Adress.s = StringField(GetGadgetText(#Main_Adress),1,":")
  Protected Port.s   = StringField(GetGadgetText(#Main_Adress),2,":")
  ServerID = OpenNetworkConnection(Adress,Val(Port))
  If ServerID = #False
    MessageRequester("Warning!","Connection failed!",#MB_ICONWARNING)
  EndIf
EndProcedure
Procedure SendNetworkString2(ID.l,String.s)
  SendNetworkString(ID,String)
  AddGadgetItem(#Main_Debugger,-1,FormatDate("%hh:%ii:%ss",Date())+": --> "+String)
EndProcedure
Procedure CommandParser()
  Protected DataLength.l, String.s, Part.s, i.l
  
  DataLength = ReceiveNetworkData(ServerID,*Buffer,BufferLength)
  String     = PeekS(*Buffer,DataLength)
  
  For i=1 To CountString(String,"|")
    Part = StringField(String,i,"|")
    AddGadgetItem(#Main_Debugger,-1,FormatDate("%hh:%ii:%ss",Date())+": <-- "+Part+"|")
    Select StringField(Part,1," ")
      Case "$Lock"
        SendNetworkString2(ServerID,"$Key "+LockToKey(StringField(Part,2," "))+"|")
        Debug StringField(Part,2," ")
        SendNetworkString2(ServerID,"$ValidateNick PureDCDevTest|")
      Case "$HubName"
      Case "$Hello"
    EndSelect
  Next
EndProcedure

Repeat
  WindowEvent = WindowEvent()
  If ServerID <> 0
    NetworkEvent = NetworkClientEvent(ServerID)
  EndIf
  
  If WindowEvent=#False And NetworkEvent=#False
    Delay(2)
    Continue
  EndIf
  
  Select WindowEvent
    Case #PB_Event_CloseWindow: Break
    Case #PB_Event_SizeWindow
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Main_Connect
          ConnectToServer()
      EndSelect
  EndSelect
  
  Select NetworkEvent
    Case #PB_NetworkEvent_Data
      CommandParser()
  EndSelect
ForEver

If ServerID <> 0
  CloseNetworkConnection(ServerID)
EndIf

Procedure.s LockToKey(StrLock.s)
  Protected TLock2Key.s
  Protected TChar.l
  Protected Result.s, i.l
  If Len(StrLock) < 3
    ProcedureReturn Left("BROKENCLIENT", Len(StrLock))
  EndIf
  TLock2Key = Chr( (Asc(Left(StrLock, 1)) ! Asc(Right(StrLock, 1))) ! (Asc(Mid(StrLock, Len(StrLock) - 1, 1)) ! 5))
  For i = 2 To Len(StrLock)
    TLock2Key = TLock2Key + Chr(Asc(Mid(StrLock, i, 1)) ! Asc(Mid(StrLock, i - 1, 1)) )
  Next i
  For i = 1 To Len(TLock2Key)
    TChar = Asc(Mid(TLock2Key, i, 1))
    TChar = (TChar * 16) + (TChar / 16)
    TChar = TChar % 256
    If TChar = 0 Or TChar = 5 Or TChar = 36 Or TChar = 96 Or TChar = 124 Or TChar = 126
      result + "/%DCN" + Right("000" + Str(TChar), 3) + "%/"
    Else
      result + Chr(TChar)
    EndIf
  Next
  ProcedureReturn result
EndProcedure
You can test against servers with this :wink: