user.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package wire
  2. import (
  3. "crypto/md5"
  4. "io"
  5. )
  6. // WeakMD5PasswordHash hashes password and authKey for AIM v3.5-v4.7.
  7. //
  8. //goland:noinspection ALL
  9. func WeakMD5PasswordHash(pass, authKey string) []byte {
  10. hash := md5.New()
  11. io.WriteString(hash, authKey)
  12. io.WriteString(hash, pass)
  13. io.WriteString(hash, "AOL Instant Messenger (SM)")
  14. return hash.Sum(nil)
  15. }
  16. // StrongMD5PasswordHash hashes password and authKey for AIM v4.8+.
  17. //
  18. //goland:noinspection ALL
  19. func StrongMD5PasswordHash(pass, authKey string) []byte {
  20. top := md5.New()
  21. io.WriteString(top, pass)
  22. bottom := md5.New()
  23. io.WriteString(bottom, authKey)
  24. bottom.Write(top.Sum(nil))
  25. io.WriteString(bottom, "AOL Instant Messenger (SM)")
  26. return bottom.Sum(nil)
  27. }
  28. // RoastOSCARPassword roasts an OSCAR client password.
  29. func RoastOSCARPassword(roastedPass []byte) []byte {
  30. var roastTable = []byte{
  31. 0xF3, 0x26, 0x81, 0xC4, 0x39, 0x86, 0xDB, 0x92,
  32. 0x71, 0xA3, 0xB9, 0xE6, 0x53, 0x7A, 0x95, 0x7C,
  33. }
  34. return roastPass(roastedPass, roastTable)
  35. }
  36. // RoastKerberosPassword roasts a Kerberos client password.
  37. func RoastKerberosPassword(roastedPass []byte) []byte {
  38. var roastTable = []byte{
  39. 0x76, 0x91, 0xc5, 0xe7, 0xd0, 0xd9, 0x95, 0xdd,
  40. 0x9e, 0x2F, 0xea, 0xd8, 0x6B, 0x21, 0xc2, 0xbc,
  41. }
  42. return roastPass(roastedPass, roastTable)
  43. }
  44. // RoastOSCARJavaPassword roasts a Java OSCAR client password.
  45. func RoastOSCARJavaPassword(roastedPass []byte) []byte {
  46. var roastTable = []byte{
  47. 0xF3, 0xB3, 0x6C, 0x99, 0x95, 0x3F, 0xAC, 0xB6,
  48. 0xC5, 0xFA, 0x6B, 0x63, 0x69, 0x6C, 0xC3, 0x9A,
  49. }
  50. return roastPass(roastedPass, roastTable)
  51. }
  52. // RoastTOCPassword roasts a TOC client password.
  53. func RoastTOCPassword(roastedPass []byte) []byte {
  54. return roastPass(roastedPass, []byte("Tic/Toc"))
  55. }
  56. // roastPass toggles obfuscation/deobfuscates of roastedPass.
  57. func roastPass(roastedPass []byte, roastTable []byte) []byte {
  58. clearPass := make([]byte, len(roastedPass))
  59. for i := range roastedPass {
  60. clearPass[i] = roastedPass[i] ^ roastTable[i%len(roastTable)]
  61. }
  62. return clearPass
  63. }