peter9477

AES.py for Snappy

Oct 9th, 2013
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.15 KB | None | 0 0
  1. from ctypes import byref, create_string_buffer
  2. from bb.aes import *
  3.  
  4. class AES:
  5.     def __init__(self, key, mode):
  6.         self.keybytes = key.encode('ascii')
  7.         self.mode = mode
  8.  
  9.         self.ctx = sb_GlobalCtx()
  10.         self.key = sb_Key()
  11.         self.params = sb_Params()
  12.  
  13.         rc = hu_GlobalCtxCreateDefault(byref(self.ctx)); assert not rc, 'rc is %s' % rc
  14.         rc = hu_RegisterSbg56(self.ctx); assert not rc, 'rc is %s' % rc
  15.         rc = hu_RegisterSystemSeed(self.ctx); assert not rc, 'rc is %s' % rc
  16.         rc = hu_InitSbg56(self.ctx); assert not rc, 'rc is %s' % rc
  17.  
  18.         rc = hu_AESParamsCreate(self.mode, SB_AES_128_BLOCK_BITS, None, None, byref(self.params), self.ctx); assert not rc, 'rc is %s' % rc
  19.         rc = hu_AESKeySet(self.params, len(self.keybytes) * 8, self.keybytes, byref(self.key), self.ctx); assert not rc, 'rc is %s' % rc
  20.  
  21.  
  22.     def __del__(self):
  23.         hu_GlobalCtxDestroy(byref(self.ctx))
  24.  
  25.  
  26.     def encrypt(self, plaintext):
  27.         cipher = create_string_buffer(len(plaintext))
  28.         iv = create_string_buffer(16)
  29.         rc = hu_AESEncryptMsg(self.params, self.key, len(iv), iv,
  30.             len(plaintext), plaintext, cipher, self.ctx); assert not rc, 'rc is %s' % rc
  31.         return bytes(cipher)
  32.  
  33.  
  34.     def decrypt(self, ciphertext):
  35.         plain = create_string_buffer(len(ciphertext))
  36.         iv = create_string_buffer(16)
  37.         rc = hu_AESDecryptMsg(self.params, self.key, len(iv), iv,
  38.             len(ciphertext), ciphertext, plain, self.ctx); assert not rc, 'rc is %s' % rc
  39.         return bytes(plain)
  40.  
  41.  
  42.  
  43. def new(key, mode):
  44.     return AES(key, mode)
  45.  
  46.  
  47. def _test():
  48.     crypto = new('M02cnQ51Ji97vwT4', SB_AES_ECB)
  49.  
  50.     # Note: no padding done here... provide it yourself (PKCS#7)
  51.     # This plaintext is carefully chosen to be a multiple of the block size.
  52.     plain = 'This is a fine kettle of fish!!!'
  53.     assert (len(plain) % 16) == 0
  54.     cipher = crypto.encrypt(plain.encode('utf-8'))
  55.     print('cipher', cipher)
  56.     recovered = crypto.decrypt(cipher).decode('utf-8')
  57.     print('recovered', repr(recovered))
  58.     assert plain == recovered
  59.  
  60.  
  61. if __name__ == '__main__':
  62.     _test()
Advertisement
Add Comment
Please, Sign In to add comment