emulbreh/pyffx

Integer codec does not preserve length

dcalde opened this issue · 1 comments

The Integer codec does not preserve length if the pre-unpack encoded string contains leading 0's as those get stripped by the conversion to int.

i = pyffx.Integer(b'secret-key', length=5)
assert 4 == len(str(i.encrypt(1234)))

class IntegerIrreversable(pyffx.Integer):
    def unpack(self, v, t):
        return int(super(pyffx.Integer, self).unpack(v, t).lstrip('0').ljust(self.length, '9'))

i2 = IntegerIrreversable(b'secret-key', length=5)
for num in range(1000, 9999):
    assert 5 == len(str(i2.encrypt(num)))

The Integer codec is not meant to preserve length: it's for bijections on range(10**(length+1)).
If you want leading zeros to be significant (and preserve length) you can use the String codec instead:

>>> import pyffx, string
>>> c = pyffx.String('secret', alphabet=string.digits, length=5)
>>> c.encrypt('00001')
'05465'
>>> c.decrypt('05465')
'00001'