def unpackage(src_uid, dst_uid, package_b64): # b64 decode the package for decryption. package = base64.b64decode(package_b64) if not csc.yn_prompt("Are you sure you want\nto decrypt a message?"): return { "success": False, "error": "User rejected pad read request.", } try: pre = crypto.pre_unpackage(package, verbose=True) except crypto.CryptoError: traceback.print_exc() return { "success" : False, "error": "Decryption failed.", } message_length = pre["message_length"] p_text_index = pre["p_text_index"] try: skip_detected = read.decrypt_index_skipped(src_uid, dst_uid, p_text_index) reuse_detected = read.decrypt_index_used(src_uid, dst_uid, p_text_index) start_index = next_index = p_text_index (p_text, next_index) = read.read_decrypt_pad(src_uid, dst_uid, next_index, message_length) (p_body, next_index) = read.read_decrypt_pad(src_uid, dst_uid, next_index, message_length + crypto.TAG_LENGTH) (p_tag_key, _) = read.read_decrypt_pad(src_uid, dst_uid, next_index, crypto.TAG_KEY_LENGTH) except metadata.NoMetadataException: return { "success": False, "error": "Shared pad not found.", } try: message = crypto.unpackage(package, p_text, p_body, p_tag_key, verbose=True) return { "success": True, "message": message, "skip_detected": skip_detected, "reuse_detected": reuse_detected, } except crypto.IntegrityError: traceback.print_exc() logging.error("Integrity error in message from {} to {} with index {}".format( src_uid, dst_uid, start_index)) return { "success": False, "error":"Decryption failed.", # Don't tell client specifics. } except crypto.CryptoError: traceback.print_exc() return { "success": False, "error":"Decryption failed.", }
def test_package_reflexive(self): message = "Test that packaged and unpackaging returns the same message" index = 0 p_text = "otuhixnuheotuheouaoecgudoaeuteoahduao',.peaecd'983d uaoeuhu" #pseudo random typing p_body = ",'cd.ucr,'.gud.,9'ud249 l3uf19842gfpd4gdu r9'7i3pkur84gciudr.g,fi r138uf927 i'e7pduxanw;jk8" p_tag_key = "N\xbb\xcf\xb0jT\x81\x12X2.\xe5zMi\xee" self.assertEquals(len(p_body), len(p_text)+crypto.TAG_LENGTH) package = crypto.package(index, message, p_text, p_body, p_tag_key) unpackage = crypto.unpackage(package, p_text, p_body, p_tag_key) self.assertEquals(unpackage, message)