def decrypt_payload(payload, config, _params=None):
    """Decrypt some fields of a JSON payload using the given configuration."""

    try:
        json_payload = payload if type(payload) is dict else json.loads(
            payload)

        for elem, target in config.paths["$"].to_decrypt.items():
            try:
                node = get_node(json_payload, elem)

                cipher_text = decode_value(
                    node.pop(config.encrypted_value_field_name),
                    config.data_encoding)

                if not _params:
                    try:
                        encrypted_key = node.pop(
                            config.encrypted_key_field_name)
                        iv = node.pop(config.iv_field_name)
                    except KeyError:
                        raise EncryptionError(
                            "Encryption field(s) missing in payload.")

                    oaep_digest_algo = node.pop(
                        config.oaep_padding_digest_algorithm_field_name,
                        config.oaep_padding_digest_algorithm)

                    _remove_fingerprint_from_node(node, config)

                    params = SessionKeyParams(config, encrypted_key, iv,
                                              oaep_digest_algo)
                else:
                    params = _params

                cleanup_node(json_payload, elem, target)

                try:
                    update_node(
                        json_payload, target,
                        _decrypt_bytes(params.key, params.iv_spec,
                                       cipher_text))
                except KeyError:
                    raise EncryptionError("Field '" + target + "' not found!")

            except KeyError:
                pass  # encrypted data node not found, nothing to decrypt

        return json_payload

    except json.JSONDecodeError:  # not a json response - return it as is
        return payload
    except (IOError, ValueError, TypeError) as e:
        raise EncryptionError("Payload decryption failed!", e)
Exemple #2
0
    def test_update_node_primitive_type(self):
        sample_json = self.__get_sample_json()

        node = to_test.update_node(sample_json, "node1.node2",
                                   '"I am a primitive data type"')

        self.assertIsInstance(node["node1"]["node2"], str, "Not a string")
        self.assertDictEqual(
            {"node1": {
                "node2": "I am a primitive data type"
            }}, node)

        node = to_test.update_node(sample_json, "node1.node2", '4378462')

        self.assertIsInstance(node["node1"]["node2"], int, "Not an int")
        self.assertDictEqual({"node1": {"node2": 4378462}}, node)

        node = to_test.update_node(sample_json, "node1.node2", 'true')

        self.assertIsInstance(node["node1"]["node2"], bool, "Not a bool")
        self.assertDictEqual({"node1": {"node2": True}}, node)
Exemple #3
0
    def test_update_node(self):
        sample_json = self.__get_sample_json()
        node = to_test.update_node(sample_json, "$",
                                   '{"node3": {"brightness": 6}}')

        self.assertIsInstance(node, dict, "Not a dict")
        self.assertDictEqual({"node3": {"brightness": 6}}, node)

        sample_json = self.__get_sample_json()
        node = to_test.update_node(sample_json, "node1",
                                   '{"node3": {"brightness": 6}}')

        self.assertIsInstance(node, dict, "Not a dict")
        self.assertDictEqual(
            {
                "node1": {
                    "node2": {
                        "colour": "red",
                        "shape": "circle",
                        "position": {
                            "lat": 1,
                            "long": 3
                        }
                    },
                    "node3": {
                        "brightness": 6
                    }
                }
            }, node)

        sample_json = self.__get_sample_json()
        node = to_test.update_node(sample_json, "node1.node2",
                                   '{"node3": {"brightness": 6}}')

        self.assertIsInstance(node, dict, "Not a dict")
        self.assertDictEqual(
            {
                "node1": {
                    "node2": {
                        "colour": "red",
                        "shape": "circle",
                        "position": {
                            "lat": 1,
                            "long": 3
                        },
                        "node3": {
                            "brightness": 6
                        }
                    }
                }
            }, node)

        sample_json = self.__get_sample_json()
        node = to_test.update_node(sample_json, "node1.node2.new",
                                   '{"node3": {"brightness": 6}}')

        self.assertIsInstance(node, dict, "Not a dict")
        self.assertDictEqual(
            {
                "node1": {
                    "node2": {
                        "colour": "red",
                        "shape": "circle",
                        "position": {
                            "lat": 1,
                            "long": 3
                        },
                        "new": {
                            "node3": {
                                "brightness": 6
                            }
                        }
                    }
                }
            }, node)
Exemple #4
0
    def test_update_node_not_json(self):
        sample_json = self.__get_sample_json()
        node = to_test.update_node(sample_json, "node1.node2",
                                   "not a json string")

        self.assertIsInstance(node["node1"]["node2"], str, "not a json string")