lamport.py0000600000175000017500000000152513730574334012066 0ustar tanjatanjaimport signbit from signempty import sha3_256 def keypair(): keys = [signbit.keypair() for n in range(256)] public,secret = zip(*keys) return public,secret def sign(message,secret): msg = message.to_bytes(200, byteorder="little") h = sha3_256(msg) hbits = [1 & (h[i//8])>>(i%8) for i in range(256)] sigs = [signbit.sign(hbits[i],secret[i]) for i in range(256)] return sigs, message def open(sm,public): message = sm[1] msg = message.to_bytes(200, byteorder="little") h = sha3_256(msg) hbits = [1 & (h[i//8])>>(i%8) for i in range(256)] for i in range(256): if hbits[i] != signbit.open(sm[0][i],public[i]): raise Exception('bit %d of hash does not match' % i) return message # example: # >>> import lamport # >>> pk,sk = lamport.keypair() # >>> sm = lamport.sign('hello',sk) # >>> lamport.open(sm,pk) # 'hello' sign4bits.py0000600000175000017500000000142313705076630012311 0ustar tanjatanjaimport signbit def keypair(): p0,s0 = signbit.keypair() p1,s1 = signbit.keypair() p2,s2 = signbit.keypair() p3,s3 = signbit.keypair() return p0+p1+p2+p3,s0+s1+s2+s3 def sign(m,secret): if type(m) != int: raise Exception('message must be int') if m < 0 or m > 15: raise Exception('message must be between 0 and 15') sm0 = signbit.sign(1 & (m >> 0),secret[0:64]) sm1 = signbit.sign(1 & (m >> 1),secret[64:128]) sm2 = signbit.sign(1 & (m >> 2),secret[128:192]) sm3 = signbit.sign(1 & (m >> 3),secret[192:256]) return sm0+sm1+sm2+sm3 def open(sm,public): m0 = signbit.open(sm[0:2],public[0:64]) m1 = signbit.open(sm[2:4],public[64:128]) m2 = signbit.open(sm[4:6],public[128:192]) m3 = signbit.open(sm[6:],public[192:256]) return m0 + 2*m1 + 4*m2 + 8*m3 signbit.py0000600000175000017500000000110713705076710012040 0ustar tanjatanjaimport signempty def keypair(): p0,s0 = signempty.keypair() p1,s1 = signempty.keypair() return p0+p1,s0+s1 def sign(message,secret): if message == 0: return ('0' , signempty.sign('',secret[0:32])) if message == 1: return ('1' , signempty.sign('',secret[32:64])) raise Exception('message must be 0 or 1') def open(signedmessage,public): if signedmessage[0] == '0': signempty.open(signedmessage[1],public[0:32]) return 0 if signedmessage[0] == '1': signempty.open(signedmessage[1],public[32:64]) return 1 raise Exception('message must be 0 or 1') signempty.py0000600000175000017500000000075613705174177012437 0ustar tanjatanjaimport os; import binascii; import hashlib; def sha3_256(x): h = hashlib.sha3_256() h.update(x) return h.digest() def keypair(): secret = sha3_256(os.urandom(32)) public = sha3_256(secret) return public,secret def sign(message,secret): if message != '': raise Exception('nonempty message') signedmessage = secret return signedmessage def open(signedmessage,public): if sha3_256(signedmessage) != public: raise Exception('bad signature') message = '' return message slow_winternitz.py0000600000175000017500000000074713705076541013675 0ustar tanjatanjaimport weak_winternitz def keypair(): keys = [weak_winternitz.keypair() for n in range(2)] public,secret = zip(*keys) return public,secret def sign(m,secret): sign0 = weak_winternitz.sign(m,secret[0]) sign1 = weak_winternitz.sign(16-m,secret[1]) return sign0, sign1, m def open(sm,public): m0 = weak_winternitz.open(sm[0],public[0]) m1 = weak_winternitz.open(sm[1],public[1]) if m0 != sm[2] or m1 != (16-sm[2]): raise Exception('Invalid signature') return sm[2] weak_winternitz.py0000600000175000017500000000137113705175572013636 0ustar tanjatanjaimport os; import binascii; from signempty import sha3_256 def keypair(): secret = sha3_256(os.urandom(32)) public = sha3_256(secret) for i in range(16): public = sha3_256(public) return public,secret def sign(m,secret): if type(m) != int: raise Exception('message must be int') if m < 0 or m > 15: raise Exception('message must be between 0 and 15') sign = secret for i in range(m): sign = sha3_256(sign) return sign, m def open(sm,public): if type(sm[1]) != int: raise Exception('message must be int') if sm[1] < 0 or sm[1] > 15: raise Exception('message must be between 0 and 15') check = sm[0] for i in range(16-sm[1]): check = sha3_256(check) if sha3_256(check) != public: raise Exception('bad signature') return sm[1]