diff --git a/codebreak/__init__.py b/codebreak/__init__.py new file mode 100755 index 0000000..2dfc0bb --- /dev/null +++ b/codebreak/__init__.py @@ -0,0 +1,149 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +import sys + +printable = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()[]{}`~/=\\?+|\',."<> ' + +def unpack(fmt, buf): + """Unpack buf based on fmt, return the rest as a string.""" + + size = struct.calcsize(fmt) + vals = struct.unpack(fmt, buf[:size]) + return vals + (buf[size:],) + + +def to_printable(c): + if c in printable: + return c + elif c == '\0': + return 'โ€' + else: + return 'ยท' + + +def hexdump(buf, f=sys.stdout): + "Print a hex dump of buf" + + offset = 0 + + while buf: + s = buf[:16] + o = [('%02x' % ord(c)) for c in s] + ([' '] * (16 - len(s))) + p = [to_printable(c) for c in s] + + f.write('%08x ' % offset) + + f.write(' '.join(o[:8])) + f.write(' ') + f.write(' '.join(o[8:])) + + f.write(' โ•‘') + + f.write(''.join(p)) + + f.write('โ•‘\n') + + buf = buf[16:] + offset += 16 + + +def cstring(buf): + "Return buf if buf were a C-style (NULL-terminate) string" + + i = buf.index('\0') + return buf[:i] + + +def md5sum(txt): + return md5.new(txt).hexdigest() + + +def assert_equal(a, b): + assert a == b, ('%r != %r' % (a, b)) + + +def assert_in(a, *b): + assert a in b, ('%r not in %r' % (a, b)) + + +## +## Binary stuff +## + +def bin(i): + """Return the binary representation of i""" + + r = [] + while i > 0: + r.append(i % 2) + i = i >> 1 + r.reverse() + s = ''.join(str(x) for x in r) + return s + +class bitvector: + def __init__(self, i, length=None): + if type(i) == type(''): + self._val = 0 + for c in i: + self._val <<= 8 + self._val += ord(c) + if length is not None: + self._len = length + else: + self._len = len(i) * 8 + else: + self._val = i + if length is not None: + self._len = length + else: + self._len = 0 + while i > 0: + i >>= 1 + self._len += 1 + + def __len__(self): + return self._len + + def __getitem__(self, idx): + if idx > self._len: + raise IndexError() + idx = self._len - idx + return int((self._val >> idx) & 1) + + def __getslice__(self, a, b): + if b > self._len: + b = self._len + i = self._val >> (self._len - b) + l = b - a + mask = (1 << l) - 1 + return bitvector(i & mask, length=l) + + def __iter__(self): + v = self._val + for i in xrange(self._len): + yield int(v & 1) + v >>= 1 + + def __str__(self): + r = '' + v = self._val + i = self._len + while i > 8: + o = ((v >> (i - 8)) & 0xFF) + r += chr(o) + i -= 8 + if i > 0: + o = v & ((1 << i) - 1) + r += chr(o) + return r + + def __int__(self): + return self._val + + def __repr__(self): + l = list(self) + l.reverse() + return '' + diff --git a/codebreak.py b/codebreak/crypto.py similarity index 76% rename from codebreak.py rename to codebreak/crypto.py index 778d167..87684df 100644 --- a/codebreak.py +++ b/codebreak/crypto.py @@ -35,86 +35,6 @@ english_frequency = {'A': .08167, 'Y': .01974, 'Z': .00074} -## -## Binary stuff -## - -def bin(i): - """Return the binary representation of i""" - - r = [] - while i > 0: - r.append(i % 2) - i = i >> 1 - r.reverse() - s = ''.join(str(x) for x in r) - return s - -class bitvector: - def __init__(self, i, length=None): - if type(i) == type(''): - self._val = 0 - for c in i: - self._val <<= 8 - self._val += ord(c) - if length is not None: - self._len = length - else: - self._len = len(i) * 8 - else: - self._val = i - if length is not None: - self._len = length - else: - self._len = 0 - while i > 0: - i >>= 1 - self._len += 1 - - def __len__(self): - return self._len - - def __getitem__(self, idx): - if idx > self._len: - raise IndexError() - idx = self._len - idx - return int((self._val >> idx) & 1) - - def __getslice__(self, a, b): - if b > self._len: - b = self._len - i = self._val >> (self._len - b) - l = b - a - mask = (1 << l) - 1 - return bitvector(i & mask, length=l) - - def __iter__(self): - v = self._val - for i in xrange(self._len): - yield int(v & 1) - v >>= 1 - - def __str__(self): - r = '' - v = self._val - i = self._len - while i > 8: - o = ((v >> (i - 8)) & 0xFF) - r += chr(o) - i -= 8 - if i > 0: - o = v & ((1 << i) - 1) - r += chr(o) - return r - - def __int__(self): - return self._val - - def __repr__(self): - l = list(self) - l.reverse() - return '' - ## ## Statistical stuff ## diff --git a/resequence.py b/codebreak/resequence.py similarity index 100% rename from resequence.py rename to codebreak/resequence.py