Subversion Repositories pub

Compare Revisions

Ignore whitespace Rev 167 → Rev 168

/relevation/branches/1.1-PyCryptoPlus/python-cryptoplus/src/CryptoPlus/Util/util.py
0,0 → 1,55
def number2string(i):
"""Convert a number to a string
 
Input: long or integer
Output: string (big-endian)
"""
s=hex(i)[2:].rstrip('L')
if len(s) % 2:
s = '0' + s
return s.decode('hex')
 
def number2string_N(i, N):
"""Convert a number to a string of fixed size
 
i: long or integer
N: length of string
Output: string (big-endian)
"""
s = '%0*x' % (N*2, i)
return s.decode('hex')
 
def string2number(i):
""" Convert a string to a number
 
Input: string (big-endian)
Output: long or integer
"""
return int(i.encode('hex'),16)
 
def xorstring(a,b):
"""XOR two strings of same length
 
For more complex cases, see CryptoPlus.Cipher.XOR"""
assert len(a) == len(b)
return number2string_N(string2number(a)^string2number(b), len(a))
 
class Counter(str):
#found here: http://www.lag.net/pipermail/paramiko/2008-February.txt
"""Necessary for CTR chaining mode
 
Initializing a counter object (ctr = Counter('xxx'), gives a value to the counter object.
Everytime the object is called ( ctr() ) it returns the current value and increments it by 1.
Input/output is a raw string.
 
Counter value is big endian"""
def __init__(self, initial_ctr):
if not isinstance(initial_ctr, str):
raise TypeError("nonce must be str")
self.c = int(initial_ctr.encode('hex'), 16)
def __call__(self):
# This might be slow, but it works as a demonstration
ctr = ("%032x" % (self.c,)).decode('hex')
self.c += 1
return ctr