Skip to content

Commit cad0c97

Browse files
Fixing the end2end tests
1 parent 52f3fd0 commit cad0c97

8 files changed

+127
-54
lines changed

client_encryption/constraints.txt

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# requirements.txt
2+
3+
buyer-payment-agent-openapi-gen-v5 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v5/buyer_payment_agent
4+
buyer-payment-agent-openapi-gen-v6 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v6/buyer_payment_agent
5+
certifi==2023.5.7
6+
cffi==1.15.1
7+
charset-normalizer==2.0.12
8+
click==8.1.7
9+
client-encryption-python-service-test @ file:///Users/e142756/work/client-libs-end-to-end-tests-python
10+
colorama==0.4.6
11+
ConfigArgParse==1.7
12+
coverage==7.4.1
13+
cryptography==41.0.7
14+
Deprecated==1.2.5
15+
digital-enablement-openapi-gen-v5 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v5/digital_enablement
16+
digital-enablement-openapi-gen-v6 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v6/digital_enablement
17+
distlib==0.3.6
18+
filelock==3.12.2
19+
frozendict==2.3.10
20+
fsspec==2023.10.0
21+
huggingface-hub==0.17.3
22+
id-assist-openapi-gen-v5 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v5/id_assist
23+
id-assist-openapi-gen-v6 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v6/id_assist
24+
idna==3.4
25+
installments-fi-openapi-gen-v5 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v5/installments_fi
26+
installments-fi-openapi-gen-v6 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v6/installments_fi
27+
Jinja2==3.1.2
28+
joblib==1.3.2
29+
MarkupSafe==2.1.3
30+
-e git+https://github.com/Mastercard/client-encryption-python.git@515938505e376d3e458d468c054701b5e29d8cf0#egg=mastercard_client_encryption
31+
-e git+https://github.com/Mastercard/oauth1-signer-python.git@4177b42109b0884fd477c15789f02529eff0fd5e#egg=mastercard_oauth1_signer
32+
mpmath==1.3.0
33+
networkx==3.2.1
34+
nltk==3.8.1
35+
numpy==1.26.1
36+
packaging==23.2
37+
payment-account-management-openapi-gen-v5 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v5/payment_account_management
38+
Pillow==10.1.0
39+
pipenv==2023.6.12
40+
platformdirs==3.5.3
41+
pycparser==2.21
42+
pycryptodome==3.19.1
43+
pyLanguagetool==0.10.0
44+
pyOpenSSL==23.2.0
45+
pyspellchecker==0.7.2
46+
python-dateutil==2.7.5
47+
PyYAML==6.0
48+
regex==2023.10.3
49+
reportlab==4.0.7
50+
requests==2.27.1
51+
safetensors==0.4.0
52+
sentencepiece==0.1.99
53+
six==1.16.0
54+
supplier-payment-agent-openapi-gen-v5 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v5/supplier_payment_agent
55+
supplier-payment-agent-openapi-gen-v6 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v6/supplier_payment_agent
56+
sympy==1.12
57+
tabulate==0.9.0
58+
token-connect-openapi-gen-v5 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v5/token_connect
59+
token-connect-openapi-gen-v6 @ file:///Users/e142756/work/client-libs-end-to-end-tests-python/client_encryption_tests/services/clients/openapi_gen_v6/token_connect
60+
tokenizers==0.14.1
61+
torch==2.1.0
62+
tqdm==4.66.1
63+
transformers==4.35.0
64+
typing_extensions==4.3.0
65+
urllib3==1.26.18
66+
virtualenv==20.23.0
67+
virtualenv-clone==0.5.7
68+
wordninja==2.0.0
69+
wrapt==1.16.0

client_encryption/encoding_utils.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ def encode_bytes(_bytes, encoding):
77
"""Encode byte sequence to Hex or Base64."""
88

99
if type(_bytes) is bytes:
10-
if encoding == Encoding.HEX:
10+
if encoding == ClientEncoding.HEX:
1111
encoded = _bytes.hex()
12-
elif encoding == Encoding.BASE64:
12+
elif encoding == ClientEncoding.BASE64:
1313
encoded = base64.b64encode(_bytes).decode('utf-8')
1414
else:
1515
raise EncodingError("Encode: Invalid encoding.")
@@ -32,9 +32,9 @@ def decode_value(value, encoding):
3232
"""Decode Hex or Base64 string to byte sequence."""
3333

3434
if type(value) is str:
35-
if encoding == Encoding.HEX:
35+
if encoding == ClientEncoding.HEX:
3636
decoded = bytes.fromhex(value)
37-
elif encoding == Encoding.BASE64:
37+
elif encoding == ClientEncoding.BASE64:
3838
decoded = base64.b64decode(value)
3939
else:
4040
raise EncodingError("Decode: Invalid encoding.")
@@ -44,6 +44,6 @@ def decode_value(value, encoding):
4444
raise ValueError("Decode: Invalid or missing input string.")
4545

4646

47-
class Encoding(Enum):
47+
class ClientEncoding(Enum):
4848
BASE64 = 'BASE64'
4949
HEX = 'HEX'

client_encryption/field_level_encryption_config.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
from Crypto.Hash import SHA256
33
from client_encryption import encoding_utils
44
from client_encryption.encryption_utils import load_encryption_certificate, load_decryption_key, validate_hash_algorithm
5-
from cryptography.hazmat.primitives.serialization import PublicFormat
5+
from cryptography.hazmat.primitives.serialization import PublicFormat, Encoding
6+
67

78

89
class FieldLevelEncryptionConfig(object):
@@ -26,7 +27,8 @@ def __init__(self, conf):
2627
if "encryptionCertificate" in json_config:
2728
x509_cert, cert_type = load_encryption_certificate(json_config["encryptionCertificate"])
2829
self._encryption_certificate = x509_cert
29-
self._encryption_certificate_type = cert_type
30+
#Fixed encoding is required, regardless of initial cerrtificate encoding to ensure correct calcualtion of fingerprint value
31+
self._encryption_certificate_type = Encoding.DER
3032
self._encryption_key_fingerprint = \
3133
json_config.get("encryptionKeyFingerprint",self.__compute_fingerprint(x509_cert.public_key().public_bytes(cert_type, PublicFormat.SubjectPublicKeyInfo)))
3234
self._encryption_certificate_fingerprint = \
@@ -46,7 +48,7 @@ def __init__(self, conf):
4648

4749
self._oaep_padding_digest_algorithm = validate_hash_algorithm(json_config["oaepPaddingDigestAlgorithm"])
4850

49-
data_enc = encoding_utils.Encoding(json_config["dataEncoding"].upper())
51+
data_enc = encoding_utils.ClientEncoding(json_config["dataEncoding"].upper())
5052
self._data_encoding = data_enc
5153
self._iv_field_name = json_config["ivFieldName"]
5254
self._encrypted_key_field_name = json_config["encryptedKeyFieldName"]

client_encryption/jwe_encryption_config.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
from Crypto.Hash import SHA256
44

5-
from client_encryption.encoding_utils import Encoding
5+
from client_encryption.encoding_utils import ClientEncoding
66
from client_encryption.encryption_utils import load_encryption_certificate, load_decryption_key
7-
from cryptography.hazmat.primitives.serialization import PublicFormat
7+
from cryptography.hazmat.primitives.serialization import PublicFormat, Encoding
8+
89

910
class JweEncryptionConfig(object):
1011
"""Class implementing a full configuration for field level encryption."""
@@ -27,9 +28,10 @@ def __init__(self, conf):
2728
if "encryptionCertificate" in json_config:
2829
x509_cert, cert_type = load_encryption_certificate(json_config["encryptionCertificate"])
2930
self._encryption_certificate = x509_cert
30-
self._encryption_certificate_type = cert_type
31+
#Fixed encoding is required, regardless of initial cerrtificate encoding to ensure correct calcualtion of fingerprint value
32+
self._encryption_certificate_type = Encoding.DER
3133
self._encryption_key_fingerprint = \
32-
json_config.get("encryptionKeyFingerprint",self.__compute_fingerprint(x509_cert.public_key().public_bytes(cert_type, PublicFormat.SubjectPublicKeyInfo)))
34+
json_config.get("encryptionKeyFingerprint",self.__compute_fingerprint(x509_cert.public_key().public_bytes(Encoding.DER, PublicFormat.SubjectPublicKeyInfo)))
3335
else:
3436
self._encryption_certificate = None
3537
self._encryption_key_fingerprint = None
@@ -44,7 +46,7 @@ def __init__(self, conf):
4446
self._encrypted_value_field_name = json_config["encryptedValueFieldName"]
4547

4648
# Fixed properties
47-
self._data_encoding = Encoding.BASE64
49+
self._data_encoding = ClientEncoding.BASE64
4850
self._oaep_padding_digest_algorithm = "SHA256"
4951

5052
@property

tests/test_encoding_utils.py

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,65 +6,65 @@
66
class EncodingUtilsTest(unittest.TestCase):
77

88
def test_hex_encode(self):
9-
enc_one = to_test.encode_bytes(bytes(1), to_test.Encoding.HEX)
10-
enc_string = to_test.encode_bytes(b"some data", to_test.Encoding.HEX)
11-
enc_empty = to_test.encode_bytes(b"", to_test.Encoding.HEX)
9+
enc_one = to_test.encode_bytes(bytes(1), to_test.ClientEncoding.HEX)
10+
enc_string = to_test.encode_bytes(b"some data", to_test.ClientEncoding.HEX)
11+
enc_empty = to_test.encode_bytes(b"", to_test.ClientEncoding.HEX)
1212

1313
self.assertEqual("00", enc_one, "Encoded bytes not matching")
1414
self.assertEqual("736f6d652064617461", enc_string, "Encoded bytes not matching")
1515
self.assertEqual("", enc_empty, "Encoded bytes not matching")
1616

1717
def test_hex_decode(self):
18-
dec_one = to_test.decode_value("00", to_test.Encoding.HEX)
19-
dec_string = to_test.decode_value("736f6d652064617461", to_test.Encoding.HEX)
20-
dec_empty = to_test.decode_value("", to_test.Encoding.HEX)
18+
dec_one = to_test.decode_value("00", to_test.ClientEncoding.HEX)
19+
dec_string = to_test.decode_value("736f6d652064617461", to_test.ClientEncoding.HEX)
20+
dec_empty = to_test.decode_value("", to_test.ClientEncoding.HEX)
2121

2222
self.assertEqual(bytes(1), dec_one, "Decoded value not matching")
2323
self.assertEqual(b"some data", dec_string, "Decoded value not matching")
2424
self.assertEqual(b"", dec_empty, "Decoded value not matching")
2525

2626
def test_hex_decode_not_valid_hex(self):
27-
self.assertRaises(ValueError, to_test.decode_value, "736f6d65p064617461", to_test.Encoding.HEX)
27+
self.assertRaises(ValueError, to_test.decode_value, "736f6d65p064617461", to_test.ClientEncoding.HEX)
2828

2929
def test_base64_encode(self):
30-
enc_one = to_test.encode_bytes(bytes(1), to_test.Encoding.BASE64)
31-
enc_string = to_test.encode_bytes(b"some data", to_test.Encoding.BASE64)
32-
enc_empty = to_test.encode_bytes(b"", to_test.Encoding.BASE64)
30+
enc_one = to_test.encode_bytes(bytes(1), to_test.ClientEncoding.BASE64)
31+
enc_string = to_test.encode_bytes(b"some data", to_test.ClientEncoding.BASE64)
32+
enc_empty = to_test.encode_bytes(b"", to_test.ClientEncoding.BASE64)
3333

3434
self.assertEqual("AA==", enc_one, "Encoded bytes not matching")
3535
self.assertEqual("c29tZSBkYXRh", enc_string, "Encoded bytes not matching")
3636
self.assertEqual("", enc_empty, "Encoded bytes not matching")
3737

3838
def test_base64_decode(self):
39-
dec_one = to_test.decode_value("AA==", to_test.Encoding.BASE64)
40-
dec_string = to_test.decode_value("c29tZSBkYXRh", to_test.Encoding.BASE64)
41-
dec_empty = to_test.decode_value("", to_test.Encoding.BASE64)
39+
dec_one = to_test.decode_value("AA==", to_test.ClientEncoding.BASE64)
40+
dec_string = to_test.decode_value("c29tZSBkYXRh", to_test.ClientEncoding.BASE64)
41+
dec_empty = to_test.decode_value("", to_test.ClientEncoding.BASE64)
4242

4343
self.assertEqual(bytes(1), dec_one, "Decoded value not matching")
4444
self.assertEqual(b"some data", dec_string, "Decoded value not matching")
4545
self.assertEqual(b"", dec_empty, "Decoded value not matching")
4646

4747
def test_base64_decode_not_valid_base64(self):
48-
self.assertRaises(ValueError, to_test.decode_value, "c29tZS?kYXRh", to_test.Encoding.BASE64)
48+
self.assertRaises(ValueError, to_test.decode_value, "c29tZS?kYXRh", to_test.ClientEncoding.BASE64)
4949

5050
def test_encode_no_value(self):
51-
self.assertRaises(ValueError, to_test.encode_bytes, None, to_test.Encoding.HEX)
52-
self.assertRaises(ValueError, to_test.encode_bytes, None, to_test.Encoding.BASE64)
51+
self.assertRaises(ValueError, to_test.encode_bytes, None, to_test.ClientEncoding.HEX)
52+
self.assertRaises(ValueError, to_test.encode_bytes, None, to_test.ClientEncoding.BASE64)
5353

5454
def test_encode_not_a_byte_sequence(self):
55-
self.assertRaises(ValueError, to_test.encode_bytes, "not a byte sequence", to_test.Encoding.HEX)
56-
self.assertRaises(ValueError, to_test.encode_bytes, "not a byte sequence", to_test.Encoding.BASE64)
55+
self.assertRaises(ValueError, to_test.encode_bytes, "not a byte sequence", to_test.ClientEncoding.HEX)
56+
self.assertRaises(ValueError, to_test.encode_bytes, "not a byte sequence", to_test.ClientEncoding.BASE64)
5757

5858
def test_encode_invalid_encoding(self):
5959
self.assertRaises(EncodingError, to_test.encode_bytes, b"whatever", "ABC")
6060

6161
def test_decode_no_value(self):
62-
self.assertRaises(ValueError, to_test.decode_value, None, to_test.Encoding.HEX)
63-
self.assertRaises(ValueError, to_test.decode_value, None, to_test.Encoding.BASE64)
62+
self.assertRaises(ValueError, to_test.decode_value, None, to_test.ClientEncoding.HEX)
63+
self.assertRaises(ValueError, to_test.decode_value, None, to_test.ClientEncoding.BASE64)
6464

6565
def test_decode_not_a_string(self):
66-
self.assertRaises(ValueError, to_test.decode_value, b"736f6d652064617461", to_test.Encoding.HEX)
67-
self.assertRaises(ValueError, to_test.decode_value, b"736f6d652064617461", to_test.Encoding.BASE64)
66+
self.assertRaises(ValueError, to_test.decode_value, b"736f6d652064617461", to_test.ClientEncoding.HEX)
67+
self.assertRaises(ValueError, to_test.decode_value, b"736f6d652064617461", to_test.ClientEncoding.BASE64)
6868

6969
def test_decode_invalid_encoding(self):
7070
self.assertRaises(EncodingError, to_test.decode_value, "whatever", "ABC")

tests/test_field_level_encryption.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import json
44
import base64
55
from tests import get_mastercard_config_for_test
6-
from client_encryption.encoding_utils import Encoding
6+
from client_encryption.encoding_utils import ClientEncoding
77
from client_encryption.encryption_exception import EncryptionError
88
import client_encryption.field_level_encryption as to_test
99
from client_encryption.field_level_encryption_config import FieldLevelEncryptionConfig
@@ -105,7 +105,7 @@ def test_encrypt_payload_base64_field_encoding(self):
105105
self.__assert_payload_encrypted(payload, encrypted_payload, self._config)
106106

107107
def test_encrypt_payload_hex_field_encoding(self):
108-
self._config._data_encoding = Encoding.HEX
108+
self._config._data_encoding = ClientEncoding.HEX
109109

110110
payload = {
111111
"data": {
@@ -529,7 +529,7 @@ def test_encrypt_payload_when_session_key_params_is_None(self):
529529
self.assertEqual(6, len(encrypted_payload["encryptedData"].keys()))
530530

531531
def test_decrypt_payload_base64_field_encoding(self):
532-
self._config._data_encoding = Encoding.BASE64
532+
self._config._data_encoding = ClientEncoding.BASE64
533533
self._config._encryption_certificate_fingerprint_field_name = "encryptionCertificateFingerprint"
534534
self._config._encryption_key_fingerprint_field_name = "encryptionKeyFingerprint"
535535
self._config._oaep_padding_digest_algorithm_field_name = "oaepHashingAlgorithm"
@@ -551,7 +551,7 @@ def test_decrypt_payload_base64_field_encoding(self):
551551
self.assertDictEqual({"data": {}}, payload)
552552

553553
def test_decrypt_payload_hex_field_encoding(self):
554-
self._config._data_encoding = Encoding.HEX
554+
self._config._data_encoding = ClientEncoding.HEX
555555
self._config._encryption_certificate_fingerprint_field_name = "encryptionCertificateFingerprint"
556556
self._config._encryption_key_fingerprint_field_name = "encryptionKeyFingerprint"
557557
self._config._oaep_padding_digest_algorithm_field_name = "oaepHashingAlgorithm"
@@ -707,7 +707,7 @@ def test_decrypt_payload_fail_when_out_path_parent_does_not_exist(self):
707707

708708
def test_decrypt_payload_when_out_path_same_as_in_path(self):
709709
self._config._paths["$"]._to_decrypt = {"data": "data"}
710-
self._config._data_encoding = Encoding.HEX
710+
self._config._data_encoding = ClientEncoding.HEX
711711

712712
encrypted_payload = {
713713
"data": {
@@ -729,7 +729,7 @@ def test_decrypt_payload_when_out_path_same_as_in_path(self):
729729
self.assertNotIn("oaepHashingAlgo", payload["data"])
730730

731731
def test_decrypt_payload_when_out_path_already_contains_data(self):
732-
self._config._data_encoding = Encoding.HEX
732+
self._config._data_encoding = ClientEncoding.HEX
733733

734734
encrypted_payload = {
735735
"encryptedData": {
@@ -756,7 +756,7 @@ def test_decrypt_payload_when_out_path_already_contains_data(self):
756756
self.assertEqual("field3Value", payload["data"]["field3"])
757757

758758
def test_decrypt_payload_when_out_path_already_contains_string_data(self):
759-
self._config._data_encoding = Encoding.HEX
759+
self._config._data_encoding = ClientEncoding.HEX
760760

761761
encrypted_payload = {
762762
"encryptedData": {
@@ -778,7 +778,7 @@ def test_decrypt_payload_when_out_path_already_contains_string_data(self):
778778
self.assertEqual("field2Value", payload["data"]["field2"])
779779

780780
def test_decrypt_payload_when_in_path_contains_additional_fields(self):
781-
self._config._data_encoding = Encoding.HEX
781+
self._config._data_encoding = ClientEncoding.HEX
782782

783783
encrypted_payload = {
784784
"encryptedData": {
@@ -799,7 +799,7 @@ def test_decrypt_payload_when_in_path_contains_additional_fields(self):
799799

800800
def test_decrypt_payload_with_multiple_decryption_paths(self):
801801
self._config._paths["$"]._to_decrypt = {"encryptedData1": "data1", "encryptedData2": "data2"}
802-
self._config._data_encoding = Encoding.HEX
802+
self._config._data_encoding = ClientEncoding.HEX
803803

804804
encrypted_payload = {
805805
"encryptedData2": {
@@ -836,7 +836,7 @@ def test_decrypt_payload_when_oaep_padding_digest_algorithm_field_not_returned(s
836836

837837
def test_decrypt_payload_when_root_as_in_path(self):
838838
self._config._paths["$"]._to_decrypt = {"$": "data"}
839-
self._config._data_encoding = Encoding.HEX
839+
self._config._data_encoding = ClientEncoding.HEX
840840

841841
encrypted_payload = {
842842
"iv": "6fef040c8fe8ad9ec56b74efa194b5f7",
@@ -853,7 +853,7 @@ def test_decrypt_payload_when_root_as_in_path(self):
853853

854854
def test_decrypt_payload_when_root_as_in_and_out_path(self):
855855
self._config._paths["$"]._to_decrypt = {"$": "$"}
856-
self._config._data_encoding = Encoding.HEX
856+
self._config._data_encoding = ClientEncoding.HEX
857857

858858
encrypted_payload = {
859859
"iv": "6fef040c8fe8ad9ec56b74efa194b5f7",
@@ -870,7 +870,7 @@ def test_decrypt_payload_when_root_as_in_and_out_path(self):
870870

871871
def test_DecryptPayload_ShouldOverwriteInputObject_WhenOutPathSameAsInPath_PrimitiveTypeData(self):
872872
self._config._paths["$"]._to_decrypt = {"data": "data"}
873-
self._config._data_encoding = Encoding.HEX
873+
self._config._data_encoding = ClientEncoding.HEX
874874

875875
encrypted_payload = {
876876
"data": {
@@ -927,7 +927,7 @@ def test_decrypt_payload_when_certificate_and_key_fingerprint_field_name_not_set
927927
self.assertIn("encryptionKeyFingerprint", payload["encryptedData"])
928928

929929
def test_decrypt_payload_when_session_key_params_is_provided(self):
930-
self._config._data_encoding = Encoding.HEX
930+
self._config._data_encoding = ClientEncoding.HEX
931931

932932
encrypted_payload = {
933933
"encryptedData": {
@@ -946,7 +946,7 @@ def test_decrypt_payload_when_session_key_params_is_provided(self):
946946
self.assertDictEqual({"data": {}}, payload)
947947

948948
def test_decrypt_payload_when_session_key_params_is_None(self):
949-
self._config._data_encoding = Encoding.HEX
949+
self._config._data_encoding = ClientEncoding.HEX
950950

951951
encrypted_payload = {
952952
"encryptedData": {

0 commit comments

Comments
 (0)