import
string
import
random
import
sha
BASE16 =
'0123456789ABCDEF'
BASE30 =
'123456789ABCDEFGHJKLMNPQRTVWXY'
def
randomstring(size=20, chars=string.ascii_uppercase +
string.digits):
return
''.join((random.choice(chars) for
_ in
range(size)))
def
BaseConvert(number, fromdigits, todigits, ignore_negative=True):
if
not
ignore_negative and
str(number)[0] ==
'-':
number =
str(number)[1:]
neg =
1
else:
neg =
0
x =
long(0)
for
digit in
str(number):
x =
x *
len(fromdigits) +
fromdigits.index(digit)
res =
''
while
x > 0:
digit =
x %
len(todigits)
res =
todigits[digit] +
res
x /=
len(todigits)
if
neg:
res =
'-'
+
res
return
res
def
AddHyphens(code):
return
code[:5] +
'-'
+
code[5:10] +
'-'
+
code[10:15] +
'-'
+
code[15:]
def
SHAToBase30(digest):
tdigest =
''.join([c for
i, c in
enumerate(digest) if
i /
2
*
2
==
i])
result =
BaseConvert(tdigest, BASE16, BASE30)
while
len(result) < 17:
result =
'1'
+
result
return
result
def
loop(ecx, lichash):
part =
0
for
c in
lichash:
part =
ecx *
part +
ord(c) & 1048575
return
part
rng =
AddHyphens('CN'
+
randomstring(18, '123456789ABCDEFGHJKLMNPQRTVWXY'))
print
'License id: '
+
rng
act30 =
raw_input('Enter request code:')
lichash =
act30
hasher =
sha.new()
hasher.update(act30)
hasher.update(rng)
lichash =
AddHyphens(lichash[:3] +
SHAToBase30(hasher.hexdigest().upper()))
part5 =
format(loop(23, lichash), '05x') +
format(loop(161, lichash), '05x') +
format(loop(47, lichash),
'05x') +
format(loop(9, lichash),
'05x')
part5 =
BaseConvert(part5.upper(), BASE16, BASE30)
while
len(part5) < 17:
part5 =
'1'
+
part5
part5 =
'AXX'
+
part5
print
'Activation code: '
+
AddHyphens(part5)