Esempio n. 1
0
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.",
        }
Esempio n. 2
0
    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)