def test_package_identity(self): index = 0 message = "Test that pad being 0 is identity" p_text = chr(0)*len(message) p_body = chr(0)*(len(message)+ crypto.TAG_LENGTH) p_tag_key = chr(0) * crypto.TAG_KEY_LENGTH package = crypto.package(index, message, p_text, p_body, p_tag_key) # Should be index | message | HMAC(key, index | message) correctPackage = 6*chr(0)+message+(crypto.hmac_sha256(p_tag_key, 6*chr(0)+message)) self.assertEqual(package, correctPackage)
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)
def package(src_uid, dst_uid, message): """Encrypt a message from from_uid to to_uid. Message is plaintext. Package it up with the index and MAC so the recipient can decode it. """ if src_uid == dst_uid: return { "success": False, "error": "Rejecting message to yourself." } message = message.encode("utf-8") if not csc.yn_prompt("Are you sure you want send a\n{} byte message?".format(len(message))): return { "success": False, "error": "User rejected pad read request.", } try: (p_text, index) = read.read_encrypt_pad(src_uid, dst_uid, len(message)) (p_body, _) = read.read_encrypt_pad(src_uid, dst_uid, len(message) + crypto.TAG_LENGTH) (p_tag_key, _) = read.read_encrypt_pad(src_uid, dst_uid, crypto.TAG_KEY_LENGTH) except metadata.NoMetadataException: return { "success": False, "error": "Shared pad not found.", } except read.PadContainException: return { "success": False, "error": "Pad depleted.", } try: package = crypto.package(index, message, p_text, p_body, p_tag_key, verbose=True) # Base64 encode the package for transport. package_b64 = base64.b64encode(package) return { "success": True, "package": package_b64, } except crypto.CryptoError: traceback.print_exc() return { "success": False, "error": "Encryption failed.", }