]>
code.delx.au - pymsnt/blob - src/legacy/msn/msnp11chl.py
39a7e9bada307f4fa41f89f7685f525afdb63c59
1 # Copyright 2005 James Bunton <james@delx.cjb.net>
2 # Licensed for distribution under the GPL version 2, check COPYING for details
7 MSNP11_PRODUCT_ID
= "PROD0090YUAUV{2B"
8 MSNP11_PRODUCT_KEY
= "YMM8C_H7KCQ2S_KL"
9 MSNP11_MAGIC_NUM
= 0x0E79A9C1
12 def doChallenge(chlData
):
13 md5digest
= md5
.md5(chlData
+ MSNP11_PRODUCT_KEY
).digest()
15 # Make array of md5 string ints
16 md5Ints
= struct
.unpack("<llll", md5digest
)
17 md5Ints
= [(x
& 0x7fffffff) for x
in md5Ints
]
19 # Make array of chl string ints
20 chlData
+= MSNP11_PRODUCT_ID
21 amount
= 8 - len(chlData
) % 8
22 chlData
+= "".zfill(amount
)
23 chlInts
= struct
.unpack("<%di" % (len(chlData
)/4), chlData
)
29 while i
< len(chlInts
) - 1:
31 temp
= (MSNP11_MAGIC_NUM
* temp
) % 0x7FFFFFFF
33 temp
= md5Ints
[0] * temp
+ md5Ints
[1]
34 temp
= temp
% 0x7FFFFFFF
37 high
= (high
+ temp
) % 0x7FFFFFFF
38 high
= md5Ints
[2] * high
+ md5Ints
[3]
39 high
= high
% 0x7FFFFFFF
41 low
= low
+ high
+ temp
45 high
= littleEndify((high
+ md5Ints
[1]) % 0x7FFFFFFF)
46 low
= littleEndify((low
+ md5Ints
[3]) % 0x7FFFFFFF)
47 key
= (high
<< 32L) + low
48 key
= littleEndify(key
, "Q")
50 longs
= [x
for x
in struct
.unpack(">QQ", md5digest
)]
51 longs
= [littleEndify(x
, "Q") for x
in longs
]
52 longs
= [x ^ key
for x
in longs
]
53 longs
= [littleEndify(abs(x
), "Q") for x
in longs
]
64 def littleEndify(num
, c
="L"):
65 return struct
.unpack(">" + c
, struct
.pack("<" + c
, num
))[0]
68 if __name__
== "__main__":
71 print doChallenge(sys
.argv
[1])
73 print "No args passed"