Advertisement
peter9477

PKCS#7 pad/unpad routines for Python 3

Oct 9th, 2013
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.09 KB | None | 0 0
  1.  
  2.  
  3. def pkcs7_pad(data, blocksize=16):
  4.     padlen = blocksize - len(data) % blocksize
  5.     return data + bytes([padlen]) * padlen
  6.  
  7.  
  8. def pkcs7_unpad(data, blocksize=16):
  9.     if data:
  10.         padlen = data[-1]
  11.         if 0 < padlen < blocksize:
  12.             if data.endswith(bytes([padlen]) * padlen):
  13.                 return data[:-padlen]
  14.  
  15.     raise ValueError('incorrect padding')
  16.  
  17.  
  18. if __name__ == '__main__':
  19.     #~ import pdb; pdb.set_trace()
  20.     p = pkcs7_pad(b'')
  21.     assert p == b'\x10' * 16, p
  22.  
  23.     test = b'1234567890abc'
  24.     p = pkcs7_pad(test)
  25.     assert p == test + b'\3\3\3', p
  26.  
  27.     p = pkcs7_pad(test * 3)
  28.     assert p == test * 3 + b'\x09' * 9, p
  29.  
  30.     p = pkcs7_unpad(test + b'\3\3\3')
  31.     assert p == test, p
  32.  
  33.     p = pkcs7_unpad(test * 3 + b'\x09' * 9)
  34.     assert p == test * 3, p
  35.  
  36.     try:                pkcs7_unpad(test)
  37.     except ValueError:  pass
  38.     else:               assert False, 'exception not raised'
  39.  
  40.     try:                pkcs7_unpad(b'x' + b'\x05' * 3)
  41.     except ValueError:  pass
  42.     else:               assert False, 'exception not raised'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement