First commit
This commit is contained in:
commit
4558d33296
|
@ -0,0 +1,95 @@
|
|||
#!/usr/bin/env python
|
||||
from hashlib import sha1
|
||||
from random import SystemRandom
|
||||
import hmac
|
||||
import hashlib
|
||||
import getpass
|
||||
import ConfigParser
|
||||
import sys, getopt
|
||||
import os.path
|
||||
|
||||
def privateKeyGenerator():
|
||||
SUBGROUPS_LENGTH = [8, 4, 4, 4, 12]
|
||||
SUBGROUP_SEPARATOR = '-'
|
||||
ALLOWED_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||
sr = SystemRandom()
|
||||
allowedCharsLength = len(ALLOWED_CHARS)
|
||||
key = ""
|
||||
for i in range(0,len(SUBGROUPS_LENGTH)):
|
||||
for j in range(0,SUBGROUPS_LENGTH[i]):
|
||||
key += ALLOWED_CHARS[sr.randrange(allowedCharsLength)]
|
||||
if i < (len(SUBGROUPS_LENGTH) -1):
|
||||
key += SUBGROUP_SEPARATOR
|
||||
return key
|
||||
|
||||
def readConfig():
|
||||
private_key = ''
|
||||
homedir = os.path.expanduser('~')
|
||||
config_file = os.path.join(homedir, '.twik.conf')
|
||||
config = ConfigParser.ConfigParser()
|
||||
config.read(config_file)
|
||||
if not config.has_option('Profile', 'private_key'):
|
||||
config.add_section('Profile')
|
||||
private_key = privateKeyGenerator()
|
||||
config.set('Profile', 'private_key', private_key)
|
||||
with open(config_file, 'w+') as fp:
|
||||
config.write(fp)
|
||||
else:
|
||||
private_key = config.get('Profile', 'private_key')
|
||||
return private_key
|
||||
|
||||
def injectCharacter( input, offset, reserved, seed, length, cStart, cNum ):
|
||||
pos0 = seed % length
|
||||
pos = (pos0 + offset) % length
|
||||
for i in range(0, length - reserved):
|
||||
i2 = (pos0 + reserved + i) % length;
|
||||
c = ord(input[i2]);
|
||||
if (c >= cStart or c < ord(cStart) + cNum):
|
||||
return input;
|
||||
head = input[:pos] if pos > 0 else ""
|
||||
inject = ((seed + ord(input[pos])) % cNum) + ord(cStart)
|
||||
tail = input[pos+1:] if (pos + 1 < len(input)) else input
|
||||
return head + chr(inject) + tail
|
||||
|
||||
def main(argv):
|
||||
tag = ''
|
||||
chars = 12
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(argv, 'c:ht:h', ['chars=', 'tag=', 'help'])
|
||||
except getopt.GetoptError:
|
||||
print "you neeed tag option"
|
||||
sys.exit(2)
|
||||
|
||||
for opt, arg in opts:
|
||||
if opt in ('-c', '--chars'):
|
||||
chars = int(arg)
|
||||
elif opt in ('-t', '--tag'):
|
||||
tag = arg
|
||||
|
||||
private_key = readConfig()
|
||||
master_key = getpass.getpass()
|
||||
h1 = hmac.new(tag,private_key,sha1).digest();
|
||||
dig = h1.encode('base64')[:24]
|
||||
h = hmac.new(master_key,dig,sha1).digest();
|
||||
hash = h.encode('base64')[:-2]
|
||||
|
||||
seed = 0
|
||||
for i in range(0, len( hash )):
|
||||
seed += ord(hash[i])
|
||||
|
||||
hash = injectCharacter(hash, 0, 4, seed, chars, '0', 10)
|
||||
hash = injectCharacter(hash, 1, 4, seed, chars, '!', 15)
|
||||
hash = injectCharacter(hash, 2, 4, seed, chars, 'A', 26)
|
||||
hash = injectCharacter(hash, 3, 4, seed, chars, 'a', 26)
|
||||
|
||||
print "%s" % hash[:12]
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
||||
|
||||
|
||||
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|
Loading…
Reference in New Issue