def test_from_readme(self):
        if os.path.exists('./test_key_container.p12'):
            uri = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0"
            method = "POST"

            signing_key = authenticationutils.load_signing_key("./test_key_container.p12", "Password1")
            consumer_key = OAuthSigner("uLXKmWNmIkzIGKfA2injnNQqpZaxaBSKxa3ixEVu2f283c95!33b9b2bd960147e387fa6f3f238f07170000000000000000", signing_key)

            header = OAuth().get_authorization_header(uri, method, "payload", consumer_key, signing_key)
        else:
            print("Please add a ./test_key_container.p12 file to enable key tests")
    def test_from_readme(self):
        uri = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0"
        method = "POST"

        signing_key = authenticationutils.load_signing_key(
            "./fake-key.p12", "fakepassword")
        consumer_key = OAuthSigner(
            "uLXKmWNmIkzIGKfA2injnNQqpZaxaBSKxa3ixEVu2f283c95!33b9b2bd960147e387fa6f3f238f07170000000000000000",
            signing_key)

        header = OAuth().get_authorization_header(uri, method, "payload",
                                                  consumer_key, signing_key)
Пример #3
0
    def test_load_signing_key_should_return_key(self):
        key_container_path = "./fake-key.p12";
        key_password = "******";

        signing_key = authenticationutils.load_signing_key(key_container_path, key_password)
        self.assertTrue(signing_key.check)
       
        bits = signing_key.bits()
        self.assertEqual(bits, 2048)

        private_key_bytes = crypto.dump_privatekey(crypto.FILETYPE_PEM, signing_key)
        self.assertTrue(private_key_bytes)
Пример #4
0
 def test_get_authorization_header(self):
     if os.path.exists('./test_key_container.p12'):
         signing_key = authenticationutils.load_signing_key(
             './test_key_container.p12', "Password1")
         consumer_key = OAuthSigner("YOUR CONSUMER KEY", signing_key)
         uri = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0"
         method = "POST"
         header = OAuth().get_authorization_header(uri, method, "payload",
                                                   consumer_key,
                                                   signing_key)
     else:
         print(
             "Please add a ./test_key_container.p12 file to enable key tests"
         )
Пример #5
0
    def test_sign_request(self):
        signing_key = authenticationutils.load_signing_key(
            './test_key_container.p12', "Password1")
        consumer_key = 'dummy'
        uri = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0"

        request = Request()
        request.method = "POST"
        request.data = ""

        signer = OAuthSigner(consumer_key, signing_key)
        request = signer.sign_request(uri, request)
        auth_header = request.headers['Authorization']
        self.assertTrue("OAuth" in auth_header)
        self.assertTrue("dummy" in auth_header)
Пример #6
0
    def test_sign_signature_base_string(self):
        if os.path.exists('./test_key_container.p12'):
            signing_key = authenticationutils.load_signing_key(
                "./test_key_container.p12", "Password1")
            consumer_key = OAuthSigner("YOUR CONSUMER KEY", signing_key)

            expectedSignatureString = "IJeNKYGfUhFtj5OAPRI92uwfjJJLCej3RCMLbp7R6OIYJhtwxnTkloHQ2bgV7fks4GT/A7rkqrgUGk0ewbwIC6nS3piJHyKVc7rvQXZuCQeeeQpFzLRiH3rsb+ZS+AULK+jzDje4Fb+BQR6XmxuuJmY6YrAKkj13Ln4K6bZJlSxOizbNvt+Htnx+hNd4VgaVBeJKcLhHfZbWQxK76nMnjY7nDcM/2R6LUIR2oLG1L9m55WP3bakAvmOr392ulv1+mWCwDAZZzQ4lakDD2BTu0ZaVsvBW+mcKFxYeTq7SyTQMM4lEwFPJ6RLc8jJJ+veJXHekLVzWg4qHRtzNBLz1mA=="
            signing_string = OAuth.sign_message(self, "baseString",
                                                signing_key)
            self.maxDiff = None
            self.assertEqual(expectedSignatureString, signing_string)
        else:
            print(
                "Please add a ./test_key_container.p12 file to enable key tests"
            )
Пример #7
0
    def test_sign_request(self):
        if os.path.exists('./test_key_container.p12'):
            signing_key = authenticationutils.load_signing_key(
                './test_key_container.p12', "Password1")
            consumer_key = OAuthSigner("YOUR CONSUMER KEY", signing_key)
            uri = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0"

            request = Request()
            request.method = "POST"
            request.data = ""

            signer = OAuthSigner(consumer_key, signing_key)
            request = signer.sign_request(uri, request)
        else:
            print(
                "Please add a ./test_key_container.p12 file to enable key tests"
            )
Пример #8
0
    def test_sign_message(self):
        if os.path.exists('./test_key_container.p12'):
            signing_key = authenticationutils.load_signing_key(
                "./test_key_container.p12", "Password1")
            consumer_key = OAuthSigner("YOUR CONSUMER KEY", signing_key)
            baseString = 'POST&https%3A%2F%2Fsandbox.api.mastercard.com%2Ffraud%2Fmerchant%2Fv1%2Ftermination-inquiry&Format%3DXML%26PageLength%3D10%26PageOffset%3D0%26oauth_body_hash%3DWhqqH%252BTU95VgZMItpdq78BWb4cE%253D%26oauth_consumer_key%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26oauth_nonce%3D1111111111111111111%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1111111111%26oauth_version%3D1.0'

            signature = OAuth().sign_message(baseString, signing_key)

            signature = Util.uri_rfc3986_encode(signature)

            self.assertEqual(
                signature,
                "DvyS3R795sUb%2FcvBfiFYZzPDU%2BRVefW6X%2BAfyu%2B9fxjudQft%2BShXhpounzJxYCwOkkjZWXOR0ICTMn6MOuG04TTtmPMrOxj5feGwD3leMBsi%2B3XxcFLPi8BhZKqgapcAqlGfjEhq0COZ%2FF9aYDcjswLu0zgrTMSTp4cqXYMr9mbQVB4HL%2FjiHni5ejQu9f6JB9wWW%2BLXYhe8F6b4niETtzIe5o77%2B%2BkKK67v9wFIZ9pgREz7ug8K5DlxX0DuwdUKFhsenA5z%2FNNCZrJE%2BtLu0tSjuF5Gsjw5GRrvW33MSoZ0AYfeleh5V3nLGgHrhVjl5%2BiS40pnG2po%2F5hIAUT5ag%3D%3D"
            )
        else:
            print(
                "Please add a ./test_key_container.p12 file to enable key tests"
            )
Пример #9
0
    def test_load_signing_key_should_return_key(self):
        if os.path.exists('./test_key_container.p12'):
            key_container_path = "./test_key_container.p12"
            key_password = "******"

            signing_key = authenticationutils.load_signing_key(
                key_container_path, key_password)
            self.assertTrue(signing_key.check)

            bits = signing_key.bits()
            self.assertEqual(bits, 2048)

            private_key_bytes = crypto.dump_privatekey(crypto.FILETYPE_PEM,
                                                       signing_key)
            self.assertTrue(private_key_bytes)
        else:
            print(
                "Please add a ./test_key_container.p12 file to enable key tests"
            )
Пример #10
0
class OAuthTest(unittest.TestCase):

    signing_key = authenticationutils.load_signing_key(
        './test_key_container.p12', "Password1")

    def test_get_authorization_header_nominal(self):
        header = OAuth().get_authorization_header('https://www.example.com',
                                                  'POST', 'payload', 'dummy',
                                                  OAuthTest.signing_key)
        self.assertTrue("OAuth" in header)
        self.assertTrue("dummy" in header)

    def test_get_authorization_header_should_compute_body_hash(self):
        header = OAuth().get_authorization_header('https://www.example.com',
                                                  'POST', '{}', 'dummy',
                                                  OAuthTest.signing_key)
        self.assertTrue(
            'RBNvo1WzZ4oRRq0W9%2BhknpT7T8If536DEMBg9hyq%2F4o%3D' in header)

    def test_get_authorization_header_should_return_empty_string_body_hash(
            self):
        header = OAuth().get_authorization_header('https://www.example.com',
                                                  'GET', None, 'dummy',
                                                  OAuthTest.signing_key)
        self.assertTrue(
            '47DEQpj8HBSa%2B%2FTImW%2B5JCeuQeRkm5NMpJWZG3hSuFU%3D' in header)

    def test_get_nonce(self):
        nonce = OAuth.get_nonce()
        self.assertEqual(len(nonce), 16)

    def test_get_timestamp(self):
        timestamp = OAuth.get_timestamp()
        self.assertEqual(len(str(timestamp)), 10)

    def test_sign_message(self):
        baseString = 'POST&https%3A%2F%2Fsandbox.api.mastercard.com%2Ffraud%2Fmerchant%2Fv1%2Ftermination-inquiry&Format%3DXML%26PageLength%3D10%26PageOffset%3D0%26oauth_body_hash%3DWhqqH%252BTU95VgZMItpdq78BWb4cE%253D%26oauth_consumer_key%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26oauth_nonce%3D1111111111111111111%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1111111111%26oauth_version%3D1.0'
        signature = OAuth().sign_message(baseString, OAuthTest.signing_key)
        signature = Util.uri_rfc3986_encode(signature)
        self.assertEqual(
            signature,
            "DvyS3R795sUb%2FcvBfiFYZzPDU%2BRVefW6X%2BAfyu%2B9fxjudQft%2BShXhpounzJxYCwOkkjZWXOR0ICTMn6MOuG04TTtmPMrOxj5feGwD3leMBsi%2B3XxcFLPi8BhZKqgapcAqlGfjEhq0COZ%2FF9aYDcjswLu0zgrTMSTp4cqXYMr9mbQVB4HL%2FjiHni5ejQu9f6JB9wWW%2BLXYhe8F6b4niETtzIe5o77%2B%2BkKK67v9wFIZ9pgREz7ug8K5DlxX0DuwdUKFhsenA5z%2FNNCZrJE%2BtLu0tSjuF5Gsjw5GRrvW33MSoZ0AYfeleh5V3nLGgHrhVjl5%2BiS40pnG2po%2F5hIAUT5ag%3D%3D"
        )

    def test_oauth_parameters(self):
        uri = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0"
        method = "POST"
        parameters = OAuth().get_oauth_parameters(uri, method, 'payload',
                                                  'dummy',
                                                  OAuthTest.signing_key)
        consumer_key = parameters.get_oauth_consumer_key()
        self.assertEqual("dummy", consumer_key)

    def test_query_parser(self):
        uri = "https://sandbox.api.mastercard.com/audiences/v1/getcountries?offset=0&offset=1&length=10&empty&odd="
        oauth_parameters = OAuthParameters()
        oauth_parameters_base = oauth_parameters.get_base_parameters_dict()
        merge_parameters = oauth_parameters_base.copy()
        query_params = Util.normalize_params(uri, merge_parameters)
        self.assertEqual(query_params,
                         "empty=&length=10&odd=&offset=0&offset=1")

    def test_query_parser_encoding(self):
        uri = "https://sandbox.api.mastercard.com?param1=plus+value&param2=colon:value"
        oauth_parameters = OAuthParameters()
        oauth_parameters_base = oauth_parameters.get_base_parameters_dict()
        merge_parameters = oauth_parameters_base.copy()
        query_params = Util.normalize_params(uri, merge_parameters)
        self.assertEqual(query_params,
                         "param1=plus%20value&param2=colon%3Avalue")

    def test_nonce_length(self):
        nonce = OAuth.get_nonce()
        self.assertEqual(16, len(nonce))

    def test_nonce_uniqueness(self):
        init = OAuth.get_nonce()
        l = []
        for i in range(0, 100000):
            l.append(init + OAuth.get_nonce())

        self.assertEqual(self.list_duplicates(l), [])

    def list_duplicates(self, seq):
        seen = set()
        seen_add = seen.add
        # adds all elements it doesn't know yet to seen and all other to seen_twice
        seen_twice = set(x for x in seq if x in seen or seen_add(x))
        # turn the set into a list (as requested)
        return list(seen_twice)

    def test_params_string_rfc_example_1(self):
        uri = "https://sandbox.api.mastercard.com"

        oauth_parameters1 = OAuthParameters()
        oauth_parameters1.set_oauth_consumer_key("9djdj82h48djs9d2")
        oauth_parameters1.set_oauth_signature_method("HMAC-SHA1")
        oauth_parameters1.set_oauth_timestamp("137131201")
        oauth_parameters1.set_oauth_nonce("7d8f3e4a")

        oauth_parameters_base1 = oauth_parameters1.get_base_parameters_dict()
        merge_parameters1 = oauth_parameters_base1.copy()
        query_params1 = Util.normalize_params(uri, merge_parameters1)

        self.assertEqual(
            "oauth_consumer_key=9djdj82h48djs9d2&oauth_nonce=7d8f3e4a&oauth_signature_method=HMAC-SHA1&oauth_timestamp=137131201",
            query_params1)

    def test_params_string_rfc_example_2(self):
        uri = "https://sandbox.api.mastercard.com?b5=%3D%253D&a3=a&a3=2%20q&c%40=&a2=r%20b&c2="

        oauth_parameters2 = OAuthParameters()
        oauth_parameters_base2 = oauth_parameters2.get_base_parameters_dict()
        merge_parameters2 = oauth_parameters_base2.copy()
        query_params2 = Util.normalize_params(uri, merge_parameters2)

        self.assertEqual("a2=r%20b&a3=2%20q&a3=a&b5=%3D%253D&c%40=&c2=",
                         query_params2)

    def test_params_string_ascending_byte_value_ordering(self):
        url = "https://localhost?b=b&A=a&A=A&B=B&a=A&a=a&0=0"

        oauth_parameters = OAuthParameters()
        oauth_parameters_base = oauth_parameters.get_base_parameters_dict()
        merge_parameters = oauth_parameters_base.copy()
        norm_params = Util.normalize_params(url, merge_parameters)

        self.assertEqual("0=0&A=A&A=a&B=B&a=A&a=a&b=b", norm_params)

    def test_signature_base_string(self):
        uri = "https://api.mastercard.com"
        base_uri = Util.normalize_url(uri)

        oauth_parameters = OAuthParameters()
        oauth_parameters.set_oauth_body_hash("body/hash")
        oauth_parameters.set_oauth_nonce("randomnonce")

        base_string = OAuth.get_base_string(
            base_uri, "POST", oauth_parameters.get_base_parameters_dict())
        self.assertEqual(
            "POST&https%3A%2F%2Fapi.mastercard.com%2F&oauth_body_hash%3Dbody%2Fhash%26oauth_nonce%3Drandomnonce",
            base_string)

    def test_signature_base_string2(self):
        body = "<?xml version=\"1.0\" encoding=\"Windows-1252\"?><ns2:TerminationInquiryRequest xmlns:ns2=\"http://mastercard.com/termination\"><AcquirerId>1996</AcquirerId><TransactionReferenceNumber>1</TransactionReferenceNumber><Merchant><Name>TEST</Name><DoingBusinessAsName>TEST</DoingBusinessAsName><PhoneNumber>5555555555</PhoneNumber><NationalTaxId>1234567890</NationalTaxId><Address><Line1>5555 Test Lane</Line1><City>TEST</City><CountrySubdivision>XX</CountrySubdivision><PostalCode>12345</PostalCode><Country>USA</Country></Address><Principal><FirstName>John</FirstName><LastName>Smith</LastName><NationalId>1234567890</NationalId><PhoneNumber>5555555555</PhoneNumber><Address><Line1>5555 Test Lane</Line1><City>TEST</City><CountrySubdivision>XX</CountrySubdivision><PostalCode>12345</PostalCode><Country>USA</Country></Address><DriversLicense><Number>1234567890</Number><CountrySubdivision>XX</CountrySubdivision></DriversLicense></Principal></Merchant></ns2:TerminationInquiryRequest>"
        url = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0&PageLength=10"
        method = "POST"

        oauth_parameters = OAuthParameters()
        oauth_parameters.set_oauth_consumer_key(
            "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
        oauth_parameters.set_oauth_nonce("1111111111111111111")
        oauth_parameters.set_oauth_timestamp("1111111111")
        oauth_parameters.set_oauth_version("1.0")
        oauth_parameters.set_oauth_body_hash("body/hash")
        encoded_hash = Util.base64_encode(Util.sha256_encode(body))
        oauth_parameters.set_oauth_body_hash(encoded_hash)

        oauth_parameters_base = oauth_parameters.get_base_parameters_dict()
        merge_parameters = oauth_parameters_base.copy()

        query_params = Util.normalize_params(url, merge_parameters)
        base_string = OAuth.get_base_string(
            url, method, oauth_parameters.get_base_parameters_dict())
        expected = "POST&https%3A%2F%2Fsandbox.api.mastercard.com%2Ffraud%2Fmerchant%2Fv1%2Ftermination-inquiry&Format%3DXML%26PageLength%3D10%26PageOffset%3D0%26oauth_body_hash%3Dh2Pd7zlzEZjZVIKB4j94UZn%2FxxoR3RoCjYQ9%2FJdadGQ%3D%26oauth_consumer_key%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26oauth_nonce%3D1111111111111111111%26oauth_timestamp%3D1111111111%26oauth_version%3D1.0"

        self.assertEqual(expected, base_string)

    def test_sign_signature_base_string_invalid_key(self):
        self.assertRaises(AttributeError, OAuth.sign_message, self,
                          "some string", None)

    def test_sign_signature_base_string(self):
        expectedSignatureString = "IJeNKYGfUhFtj5OAPRI92uwfjJJLCej3RCMLbp7R6OIYJhtwxnTkloHQ2bgV7fks4GT/A7rkqrgUGk0ewbwIC6nS3piJHyKVc7rvQXZuCQeeeQpFzLRiH3rsb+ZS+AULK+jzDje4Fb+BQR6XmxuuJmY6YrAKkj13Ln4K6bZJlSxOizbNvt+Htnx+hNd4VgaVBeJKcLhHfZbWQxK76nMnjY7nDcM/2R6LUIR2oLG1L9m55WP3bakAvmOr392ulv1+mWCwDAZZzQ4lakDD2BTu0ZaVsvBW+mcKFxYeTq7SyTQMM4lEwFPJ6RLc8jJJ+veJXHekLVzWg4qHRtzNBLz1mA=="
        signing_string = OAuth.sign_message(self, "baseString",
                                            OAuthTest.signing_key)
        self.assertEqual(expectedSignatureString, signing_string)

    def test_sign_json_body(self):
        uri = "https://sandbox.api.mastercard.com/restservices/clients"
        consumer_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        method = "POST"
        body = {
            "clientBaseAddressData": {
                "addressLine1": "Testowa 5",
                "city": "Warszawa",
                "postalCode": "23-456"
            },
            "clientContactData": {
                "phoneNumberMobile": "test"
            },
            "clientNumber": "2019102301",
            "clientPersonalData": {
                "countryCode": "BEL",
                "shortName": "test"
            },
            "embossedData": {
                "embossedFirstName": "Pavel",
                "embossedLastName": "TEST"
            },
            "clientType": "PR"
        }
        oauth_parameters = OAuthParameters()
        oauth_parameters.set_oauth_consumer_key(consumer_key)
        oauth_parameters.set_oauth_nonce("1111111111111111111")
        oauth_parameters.set_oauth_timestamp('1111111111')
        oauth_parameters.set_oauth_signature_method("RSA-SHA256")
        oauth_parameters.set_oauth_version("1.0")
        oauth_parameters.set_oauth_body_hash(
            OAuth().get_encoded_body_hash(body))

        base_string = OAuth.get_base_string(
            uri, method, oauth_parameters.get_base_parameters_dict())
        signed_body = OAuth.sign_message(self, base_string, self.signing_key)

        self.assertEqual(
            "F3zw3Cqjqx3bsHM9BItsqwGkZx1esgsmyUIr8G1/ydbMSvnPzTJ6OeTBhlgln4R7MybyxErUbTaiuRRMD8z6P4WQ/QIRzZefqvcDBJ1e/jgmPIvGUZmM9FsQDRZ1EaTVNIGVfxZDbJS1b7114JtxeCWeAuM/O3Si3EzFNbzQSZr17Cma6qxojv63fKWqd8NqGmq3X5ngeA1/4bo8xveBZO3iSamFjJW9H6Gf8P++paP0+ORJ4YLQ1KQR5hmP53b53fPrXk5/06CmoMGltfHJvrUE8XUCBS/Y8bJehoCw4930VVCtCQ5FBmnX0W5kY/XEoWaHWiYmOIK7QmBztSd2zQ==",
            signed_body)

    def test_url_normalization_rfc_examples1(self):
        uri = "https://www.example.net:8080"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://www.example.net:8080/", base_uri)

    def test_url_normalization_rfc_examples2(self):
        uri = "http://EXAMPLE.COM:80/r%20v/X?id=123"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("http://example.com/r%20v/X", base_uri)

    def test_url_normalization_redundant_ports1(self):
        uri = "https://api.mastercard.com:443/test?query=param"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://api.mastercard.com/test", base_uri)

    def test_url_normalization_redundant_ports2(self):
        uri = "http://api.mastercard.com:80/test"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("http://api.mastercard.com/test", base_uri)

    def test_url_normalization_redundant_ports3(self):
        uri = "https://api.mastercard.com:17443/test?query=param"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://api.mastercard.com:17443/test", base_uri)

    def test_url_normalization_remove_fragment(self):
        uri = "https://api.mastercard.com/test?query=param#fragment"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://api.mastercard.com/test", base_uri)

    def test_url_normalization_add_trailing_slash(self):
        uri = "https://api.mastercard.com"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://api.mastercard.com/", base_uri)

    def test_url_normalization_lowercase_scheme_and_host(self):
        uri = "HTTPS://API.MASTERCARD.COM/TEST"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://api.mastercard.com/TEST", base_uri)

    def test_body_hash1(self):
        oauth_parameters = OAuthParameters()
        encoded_hash = Util.base64_encode(
            Util.sha256_encode(OAuth.EMPTY_STRING))
        oauth_parameters.set_oauth_body_hash(encoded_hash)
        self.assertEqual("47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
                         encoded_hash)

    def test_body_hash2(self):
        oauth_parameters = OAuthParameters()
        encoded_hash = Util.base64_encode(Util.sha256_encode(None))
        oauth_parameters.set_oauth_body_hash(encoded_hash)
        self.assertEqual("3JN7WYkmBPWoaslpNs1/8J4l8Yrmt1joAUokx/oDnpE=",
                         encoded_hash)

    def test_body_hash3(self):
        oauth_parameters = OAuthParameters()
        encoded_hash = Util.base64_encode(
            Util.sha256_encode("{\"foõ\":\"bar\"}"))
        oauth_parameters.set_oauth_body_hash(encoded_hash)
        self.assertEqual("+Z+PWW2TJDnPvRcTgol+nKO3LT7xm8smnsg+//XMIyI=",
                         encoded_hash)

    def test_url_encode1(self):
        self.assertEqual("Format%3DXML", Util.uri_rfc3986_encode("Format=XML"))

    def test_url_encode2(self):
        self.assertEqual(
            "WhqqH%2BTU95VgZMItpdq78BWb4cE%3D",
            Util.uri_rfc3986_encode("WhqqH+TU95VgZMItpdq78BWb4cE="))

    def test_url_encode3(self):
        self.assertEqual(
            "WhqqH%2BTU95VgZMItpdq78BWb4cE%3D%26o",
            Util.uri_rfc3986_encode("WhqqH+TU95VgZMItpdq78BWb4cE=&o"))
Пример #11
0
#!/usr/bin/env python

import oauth1.authenticationutils as authenticationutils
from oauth1.oauth import OAuth
from oauth1.oauth_ext import OAuth1RSA
from oauth1.oauth_ext import HASH_SHA256
import requests
import json

# Globals
quoteAPI = 'https://sandbox.api.mastercard.com/send/v1/partners/BEL_MASEND5ged2/crossborder/quotes'

# TODO change the first value to be the path to your .p12 file, the second value is the password for the .p12 file.
signing_key = authenticationutils.load_signing_key('./MyAliasSBK-sandbox.p12',
                                                   'MyAliasSBK21')

# TODO Change the value to your consumer key
consumer_key = 'Tr0iRX-sUo74NMZXNkV5YXGDccUgt8wZwk8eo_Hfcc4c23e1!2fa9ff2b00f9468cbe63bf51287998eb0000000000000000'


# Helper functions
def get_json():
    quotejson = {
        "quoterequest": {
            "transaction_reference": "09-PYT-WCR-HDFsWERTYLKR-883166274207676",
            "sender_account_uri": "tel:+25406005",
            "recipient_account_uri": "tel:+254069832",
            "payment_amount": {
                "amount": "105.15",
                "currency": "USD"
            },
class OAuthExtTest(unittest.TestCase):
    signing_key = authenticationutils.load_signing_key(
        './test_key_container.p12', "Password1")
    consumer_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    data = 'sensistive data'
    mock_prepared_request = PreparedRequest()
    mock_prepared_request.prepare(headers={
        'Content-type': 'application/json',
        'Accept': 'application/json'
    },
                                  method="POST",
                                  url="http://www.example.com")
    payload = {
        'oauth_version': '1.0',
        'oauth_nonce': str(uuid4()),
        'oauth_timestamp': str(int(time.time())),
        'oauth_signature_method': 'RSA-SHA256',
        'oauth_consumer_key':
        'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    }

    payload_ext = {
        'oauth_version': '1.0',
        'oauth_nonce': 'xxxx213-1111-xx00-11xx-xxxx12xxxx12',
        'oauth_timestamp': '1111111111',
        'oauth_signature_method': 'RSA-SHA256',
        'oauth_consumer_key':
        'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        'oauth_body_hash': 'SamplEOaUthBoDYhASh',
        'oauth_signature': 'OauTHSinaTUrESaMPle=='
    }

    def test_oauth_body_hash_with_body_string(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        OAuthExtTest.mock_prepared_request.body = "{'A' : 'sensistive data'}"

        # Passing mock data to the actual func to get the value
        oauth_body_hash_object = oauth_object.oauth_body_hash(
            OAuthExtTest.mock_prepared_request, OAuthExtTest.payload)

        # Using mock data to find the hash value
        hashlib_val = hashlib.sha256(
            (OAuthExtTest.mock_prepared_request.body).encode('utf8')).digest()
        payload_hash_value = util.uri_rfc3986_encode(
            util.base64_encode(hashlib_val))

        self.assertEqual(oauth_body_hash_object['oauth_body_hash'],
                         payload_hash_value)

    def test_oauth_body_hash_with_body_bytes(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        OAuthExtTest.mock_prepared_request.body = b'{"A" : OAuthExtTest.data}'

        # Passing mock data to the actual func to get the value
        oauth_body_hash_object = oauth_object.oauth_body_hash(
            OAuthExtTest.mock_prepared_request, OAuthExtTest.payload)

        # Using mock data to find the hash value
        hashlib_val = hashlib.sha256(
            OAuthExtTest.mock_prepared_request.body).digest()
        payload_hash_value = util.uri_rfc3986_encode(
            util.base64_encode(hashlib_val))

        self.assertEqual(oauth_body_hash_object['oauth_body_hash'],
                         payload_hash_value)

    def test_oauth_body_hash_with_body_empty(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        OAuthExtTest.mock_prepared_request.body = ''

        # Passing mock data to the actual func to get the value
        oauth_body_hash_object = oauth_object.oauth_body_hash(
            OAuthExtTest.mock_prepared_request, OAuthExtTest.payload)

        # Using mock data to find the hash value
        hashlib_val = hashlib.sha256(
            str(OAuthExtTest.mock_prepared_request.body).encode(
                'utf8')).digest()
        payload_hash_value = util.uri_rfc3986_encode(
            util.base64_encode(hashlib_val))

        self.assertEqual(oauth_body_hash_object['oauth_body_hash'],
                         payload_hash_value)

    def test_oauth_body_hash_with_body_none(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        OAuthExtTest.mock_prepared_request.body = None

        # Passing mock data to the actual func to get the value
        oauth_body_hash_object = oauth_object.oauth_body_hash(
            OAuthExtTest.mock_prepared_request, OAuthExtTest.payload)

        # Using mock data to find the hash value
        hashlib_val = hashlib.sha256(
            str(OAuthExtTest.mock_prepared_request.body).encode(
                'utf8')).digest()
        payload_hash_value = util.uri_rfc3986_encode(
            util.base64_encode(hashlib_val))

        self.assertEqual(oauth_body_hash_object['oauth_body_hash'],
                         payload_hash_value)

    def test_oauth_body_hash_with_body_multipart(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        mock_request = PreparedRequest()
        mock_request.prepare(headers={'Content-type': 'multipart/form-data'},
                             method="GET",
                             url="http://www.mastercard.com")

        # Passing mock data to the actual func to get the value
        oauth_body_hash_object = oauth_object.oauth_body_hash(
            mock_request, OAuthExtTest.payload)

        # Using mock data to find the hash value
        hashlib_val = hashlib.sha256(
            str(OAuthExtTest.mock_prepared_request.body).encode(
                'utf8')).digest()
        payload_hash_value = util.uri_rfc3986_encode(
            util.base64_encode(hashlib_val))

        self.assertEqual(oauth_body_hash_object['oauth_body_hash'],
                         payload_hash_value)

    def test_signature(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        oauth_signature_object = oauth_object.signature(OAuthExtTest.data)
        signature = util.base64_encode(
            crypto.sign(OAuthExtTest.signing_key, OAuthExtTest.data,
                        HASH_SHA256))
        self.assertEqual(signature, oauth_signature_object)

    def test_get_nonce(self):
        nonce = OAuth1RSA.nonce()
        self.assertEqual(len(nonce), 36)

    def test_get_timestamp(self):
        timestamp = OAuth1RSA.timestamp()
        self.assertEqual(len(str(timestamp)), 10)

    def test_helper_hash_string(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        hash_object = oauth_object._hash(OAuthExtTest.data)
        self.assertEqual(
            hash_object,
            b'\xe8@\x97\xa0\x07H\x0b\xb2\x81"1\xcb\xf8\xa6@|&\xb9\xd7\xdf.\x80\xa9\x0b\xed,\x8f2\x88\xd7\xf7\xe5'
        )

    def test_helper_hash_bytes(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        hash_object = oauth_object._hash(b"value in bytes")
        self.assertEqual(
            hash_object,
            b'\\\n\x0e\xa3\xfe\x01\xd6T\x9fE\x97\x06\x937\x9d\\\xeaSz^\xe8\xab\xb1\xff:n\x9bY\xf5iV|'
        )

    def test_helper_hash_nonetype(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        hash_object = oauth_object._hash('')
        self.assertEqual(
            hash_object,
            b"\xe3\xb0\xc4B\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99o\xb9$'\xaeA\xe4d\x9b\x93L\xa4\x95\x99\x1bxR\xb8U"
        )

    def test_signable_message(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        signable_message = oauth_object.signable_message(
            OAuthExtTest.mock_prepared_request, OAuthExtTest.payload_ext)
        self.assertTrue(
            OAuthExtTest.mock_prepared_request.method in signable_message)

    def test_helper_generate_header(self):
        generate_header = OAuth1RSA._generate_header(OAuthExtTest.payload_ext)
        self.assertTrue("OAuth" in generate_header)

    def test_call(self):
        oauth_object = OAuth1RSA(OAuthExtTest.consumer_key,
                                 OAuthExtTest.signing_key)
        call_object = oauth_object.__call__(OAuthExtTest.mock_prepared_request)
        self.assertTrue("Authorization" in call_object.headers)
Пример #13
0
 def __init__(self, key_file, key_password, consumer_key):
     """Load signing key."""
     self.signing_key = authenticationutils.load_signing_key(
         key_file, key_password)
     self.consumer_key = consumer_key
Пример #14
0
class OAuthTest(unittest.TestCase):

    signing_key = authenticationutils.load_signing_key("./fake-key.p12",
                                                       "fakepassword")
    consumer_key = OAuthSigner(
        "uLXKmWNmIkzIGKfA2injnNQqpZaxaBSKxa3ixEVu2f283c95!33b9b2bd960147e387fa6f3f238f07170000000000000000",
        signing_key)

    def test_get_authorization_header(self):
        uri = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0"
        method = "POST"
        header = OAuth().get_authorization_header(uri, method, "payload",
                                                  self.consumer_key,
                                                  self.signing_key)

    def test_get_nonce(self):
        nonce = OAuth.get_nonce()
        self.assertEqual(len(nonce), 16)

    def test_get_timestamp(self):
        timestamp = OAuth.get_timestamp()
        self.assertEqual(len(str(timestamp)), 10)

    def test_sign_message(self):

        baseString = 'POST&https%3A%2F%2Fsandbox.api.mastercard.com%2Ffraud%2Fmerchant%2Fv1%2Ftermination-inquiry&Format%3DXML%26PageLength%3D10%26PageOffset%3D0%26oauth_body_hash%3DWhqqH%252BTU95VgZMItpdq78BWb4cE%253D%26oauth_consumer_key%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26oauth_nonce%3D1111111111111111111%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1111111111%26oauth_version%3D1.0'

        signature = OAuth().sign_message(baseString, self.signing_key)

        signature = Util.uri_rfc3986_encode(signature)

        self.assertEqual(
            signature,
            "nqxpgHpye%2BdOEkEbC%2FS3N1%2FCRFlZPHoyRztkRhkCoz7ISNmV9V60TQ7zwS8Q59SGQUGYuoNSVe8SWtNVQTEuRiZfXd6Eme%2BCdHfAt7%2BbNd3UsrcIHl3CJEvx7u70ItW8aOx4F7rjF%2BaIOq%2Bpc0rbuBugF%2BnElGKydpPiQrKKwE5kB3TZKVkYLLCsLU8Ry%2Fjg05d2TcnGTyfYZDchV4ui0uPzR5UH%2Fkb4ni8lchrtAeaGJwCimACIk6qNLoNnz7u9joKHtYeuZhORRVodxKB%2BAolgAQqJBMyLrseJDITmwIRTRSzQ3vclt%2BMvVs1CMbXYuvnDYd5NFv98emJgBC%2FX1A%3D%3D"
        )

    def test_oauth_parameters(self):
        uri = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0"
        method = "POST"
        parameters = OAuth().get_oauth_parameters(uri, method, "payload",
                                                  self.consumer_key,
                                                  self.signing_key)
        # print(parameters)
        consumer_key = parameters.get_oauth_consumer_key()

    def test_query_parser(self):
        uri = "https://sandbox.api.mastercard.com/audiences/v1/getcountries?offset=0&offset=1&length=10&empty&odd="

        oauth_parameters = OAuthParameters()
        oauth_parameters_base = oauth_parameters.get_base_parameters_dict()
        merge_parameters = oauth_parameters_base.copy()
        query_params = Util.normalize_params(uri, merge_parameters)
        # print(query_params)
        self.assertEqual(query_params,
                         "empty=&length=10&odd=&offset=0&offset=1")
        # - length=10&offset=1
        # + empty&length=10&odd=&offset=0&offset=1

    def test_query_parser_encoding(self):
        uri = "https://sandbox.api.mastercard.com?param1=plus+value&param2=colon:value"

        oauth_parameters = OAuthParameters()
        oauth_parameters_base = oauth_parameters.get_base_parameters_dict()
        merge_parameters = oauth_parameters_base.copy()
        query_params = Util.normalize_params(uri, merge_parameters)
        # print(query_params)
        self.assertEqual(query_params,
                         "param1=plus%20value&param2=colon%3Avalue")

    def test_query_parser_not_encoded_params(self):
        uri = "https://api.mastercard.com/audiences?param1=plus+value&param2=colon:value&param3=a space~"

        oauth_parameters = OAuthParameters()
        oauth_parameters_base = oauth_parameters.get_base_parameters_dict()
        merge_parameters = oauth_parameters_base.copy()
        query_params = Util.normalize_params(uri, merge_parameters)
        self.assertEqual(
            query_params,
            "param1=plus%20value&param2=colon%3Avalue&param3=a%20space~")
        # - param1=plus%2Bvalue&param2=colon%3Avalue&param3=a%2Bspace~
        # + param1=plus%2Bvalue&param2=colon%3Avalue&param3=a%20space~

    def test_nonce_length(self):
        nonce = OAuth.get_nonce()
        self.assertEqual(16, len(nonce))

    def test_nonce_uniqueness(self):
        init = OAuth.get_nonce()
        l = []
        for i in range(0, 100000):
            l.append(init + OAuth.get_nonce())

        # print(*l)
        # print(self.list_duplicates(l))
        self.assertEqual(self.list_duplicates(l), [])

    def list_duplicates(self, seq):
        seen = set()
        seen_add = seen.add
        # adds all elements it doesn't know yet to seen and all other to seen_twice
        seen_twice = set(x for x in seq if x in seen or seen_add(x))
        # turn the set into a list (as requested)
        return list(seen_twice)

    def test_params_string_rfc_example_1(self):
        uri = "https://sandbox.api.mastercard.com"
        # uri = "b5=%3D%253D&a3=a&a3=2%20q&c%40=&a2=r%20b&c2="

        oauth_parameters1 = OAuthParameters()
        oauth_parameters1.set_oauth_consumer_key("9djdj82h48djs9d2")
        oauth_parameters1.set_oauth_signature_method("HMAC-SHA1")
        oauth_parameters1.set_oauth_timestamp("137131201")
        oauth_parameters1.set_oauth_nonce("7d8f3e4a")

        oauth_parameters_base1 = oauth_parameters1.get_base_parameters_dict()
        merge_parameters1 = oauth_parameters_base1.copy()
        query_params1 = Util.normalize_params(uri, merge_parameters1)

        self.assertEqual(
            "oauth_consumer_key=9djdj82h48djs9d2&oauth_nonce=7d8f3e4a&oauth_signature_method=HMAC-SHA1&oauth_timestamp=137131201",
            query_params1)

    def test_params_string_rfc_example_2(self):
        uri = "https://sandbox.api.mastercard.com?b5=%3D%253D&a3=a&a3=2%20q&c%40=&a2=r%20b&c2="

        oauth_parameters2 = OAuthParameters()
        oauth_parameters_base2 = oauth_parameters2.get_base_parameters_dict()
        merge_parameters2 = oauth_parameters_base2.copy()
        query_params2 = Util.normalize_params(uri, merge_parameters2)

        self.assertEqual("a2=r%20b&a3=2%20q&a3=a&b5=%3D%253D&c%40=&c2=",
                         query_params2)
        # - a2=r%20b&a3=2%20q&a3=a&b5=%3D%253D&c%40=&c2=
        # + a2=r%2Bb&a3=2%2Bq&b5=%3D%253D

    def test_params_string_ascending_byte_value_ordering(self):
        url = "https://localhost?b=b&A=a&A=A&B=B&a=A&a=a&0=0"

        oauth_parameters = OAuthParameters()
        oauth_parameters_base = oauth_parameters.get_base_parameters_dict()
        merge_parameters = oauth_parameters_base.copy()
        norm_params = Util.normalize_params(url, merge_parameters)

        self.assertEqual("0=0&A=A&A=a&B=B&a=A&a=a&b=b", norm_params)
        # - 0=0&A=A&A=a&B=B&a=A&a=a&b=b
        # ?         ----   ----
        # + 0=0&A=A&B=B&a=a&b=b

    def test_signature_base_string(self):
        uri = "https://api.mastercard.com"
        base_uri = Util.normalize_url(uri)

        oauth_parameters = OAuthParameters()
        oauth_parameters.set_oauth_body_hash("body/hash")
        oauth_parameters.set_oauth_nonce("randomnonce")

        base_string = OAuth.get_base_string(
            base_uri, "POST", oauth_parameters,
            oauth_parameters.get_base_parameters_dict())

        self.assertEqual(
            "POST&https%3A%2F%2Fapi.mastercard.com%2F&oauth_body_hash%3Dbody%2Fhash%26oauth_nonce%3Drandomnonce",
            base_string)
        # - POST&https%3A%2F%2Fapi.mastercard.com&oauth_body_hash%3Dbody%2Fhash%26oauth_nonce%3Drandomnonce
        # + POST&https%3A%2F%2Fapi.mastercard.com%2F&oauth_body_hash%3Dbody%252Fhash%26oauth_nonce%3Drandomnonce

    def test_signature_base_string2(self):
        body = "<?xml version=\"1.0\" encoding=\"Windows-1252\"?><ns2:TerminationInquiryRequest xmlns:ns2=\"http://mastercard.com/termination\"><AcquirerId>1996</AcquirerId><TransactionReferenceNumber>1</TransactionReferenceNumber><Merchant><Name>TEST</Name><DoingBusinessAsName>TEST</DoingBusinessAsName><PhoneNumber>5555555555</PhoneNumber><NationalTaxId>1234567890</NationalTaxId><Address><Line1>5555 Test Lane</Line1><City>TEST</City><CountrySubdivision>XX</CountrySubdivision><PostalCode>12345</PostalCode><Country>USA</Country></Address><Principal><FirstName>John</FirstName><LastName>Smith</LastName><NationalId>1234567890</NationalId><PhoneNumber>5555555555</PhoneNumber><Address><Line1>5555 Test Lane</Line1><City>TEST</City><CountrySubdivision>XX</CountrySubdivision><PostalCode>12345</PostalCode><Country>USA</Country></Address><DriversLicense><Number>1234567890</Number><CountrySubdivision>XX</CountrySubdivision></DriversLicense></Principal></Merchant></ns2:TerminationInquiryRequest>"
        url = "https://sandbox.api.mastercard.com/fraud/merchant/v1/termination-inquiry?Format=XML&PageOffset=0&PageLength=10"
        method = "POST"

        oauth_parameters = OAuthParameters()
        oauth_parameters.set_oauth_consumer_key(
            "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
        oauth_parameters.set_oauth_nonce("1111111111111111111")
        oauth_parameters.set_oauth_timestamp("1111111111")
        oauth_parameters.set_oauth_version("1.0")
        oauth_parameters.set_oauth_body_hash("body/hash")
        encoded_hash = Util.base64_encode(Util.sha256_encode(body))
        oauth_parameters.set_oauth_body_hash(encoded_hash)

        oauth_parameters_base = oauth_parameters.get_base_parameters_dict()
        merge_parameters = oauth_parameters_base.copy()

        norm_params = Util.normalize_params("", merge_parameters)
        # print(oauth_parameters_base)

        query_params = OAuth.get_query_params(url)

        # print(query_params)
        normalize_params = Util.normalize_params("", query_params)

        base_string = OAuth.get_base_string(
            url, method, oauth_parameters,
            oauth_parameters.get_base_parameters_dict())

        expected = "POST&https%3A%2F%2Fsandbox.api.mastercard.com%2Ffraud%2Fmerchant%2Fv1%2Ftermination-inquiry&Format%3DXML%26PageLength%3D10%26PageOffset%3D0%26oauth_body_hash%3Dh2Pd7zlzEZjZVIKB4j94UZn%2FxxoR3RoCjYQ9%2FJdadGQ%253D%26oauth_consumer_key%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26oauth_nonce%3D1111111111111111111%26oauth_timestamp%3D1111111111%26oauth_version%3D1.0"

        self.maxDiff = None
        self.assertEqual(expected, base_string)
        # - POST&https%3A%2F%2Fsandbox.api.mastercard.com%2Ffraud%2Fmerchant%2Fv1%2Ftermination-inquiry&Format%3DXML%26PageLength%3D10%26PageOffset%3D0%26oauth_body_hash%3Dh2Pd7zlzEZjZVIKB4j94UZn%2FxxoR3RoCjYQ9%2FJdadGQ%3D%26oauth_consumer_key%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26oauth_nonce%3D1111111111111111111%26oauth_timestamp%3D1111111111%26oauth_version%3D1.0
        # + POST&https%3A%2F%2Fsandbox.api.mastercard.com%2Ffraud%2Fmerchant%2Fv1%2Ftermination-inquiry&Format%3DXML%26PageLength%3D10%26PageOffset%3D0%26oauth_body_hash%3Dh2Pd7zlzEZjZVIKB4j94UZn%252FxxoR3RoCjYQ9%252FJdadGQ%253D%26oauth_consumer_key%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%26oauth_nonce%3D1111111111111111111%26oauth_timestamp%3D1111111111%26oauth_version%3D1.0

    def test_sign_signature_base_string_invalid_key(self):
        self.assertRaises(AttributeError, OAuth.sign_message, self,
                          "some string", None)

    def test_sign_signature_base_string(self):
        # expectedSignatureString = "IJeNKYGfUhFtj5OAPRI92uwfjJJLCej3RCMLbp7R6OIYJhtwxnTkloHQ2bgV7fks4GT/A7rkqrgUGk0ewbwIC6nS3piJHyKVc7rvQXZuCQeeeQpFzLRiH3rsb+ZS+AULK+jzDje4Fb+BQR6XmxuuJmY6YrAKkj13Ln4K6bZJlSxOizbNvt+Htnx+hNd4VgaVBeJKcLhHfZbWQxK76nMnjY7nDcM/2R6LUIR2oLG1L9m55WP3bakAvmOr392ulv1+mWCwDAZZzQ4lakDD2BTu0ZaVsvBW+mcKFxYeTq7SyTQMM4lEwFPJ6RLc8jJJ+veJXHekLVzWg4qHRtzNBLz1mA=="
        expectedSignatureString = "vA7b0GT6r3GrS7Zpvy7PDMKocmG79yvpnp77GK8znpTKcY9xwKP5n4BfoP26068TyIZk9qx5TEzc4FzOKhWZF5pxN77Hne0A7gHNkaueYmfy95qxUBxLRMCevwjs5A0aW1bTW+gu7VL1cLtBYgO9Ks2axUcvxAq6aVRZvMGvFukxaZd+2XD8hE/tBwyEmvQwWO9gr5KJAFslkykjID9zs4gZ+gK0adRCvpcobRfcff+RxbtQctq3cjXwH/Fp3ZymoFtB2J+4hJ3aX4uCkIhJCV4dyWUkvx81vNyf1J5nBjqRtAoOEXOxNrz4o+kzAfcT46EUSQUTjouCO6hJfOVlaA=="
        signing_string = OAuth.sign_message(self, "baseString",
                                            self.signing_key)
        self.maxDiff = None
        self.assertEqual(expectedSignatureString, signing_string)

    def test_url_normalization_rfc_examples1(self):
        uri = "https://www.example.net:8080"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://www.example.net:8080/", base_uri)

    def test_url_normalization_rfc_examples2(self):
        uri = "http://EXAMPLE.COM:80/r%20v/X?id=123"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("http://example.com/r%20v/X", base_uri)

    def test_url_normalization_redundant_ports1(self):
        uri = "https://api.mastercard.com:443/test?query=param"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://api.mastercard.com/test", base_uri)

    def test_url_normalization_redundant_ports2(self):
        uri = "http://api.mastercard.com:80/test"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("http://api.mastercard.com/test", base_uri)

    def test_url_normalization_redundant_ports3(self):
        uri = "https://api.mastercard.com:17443/test?query=param"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://api.mastercard.com:17443/test", base_uri)

    def test_url_normalization_remove_fragment(self):
        uri = "https://api.mastercard.com/test?query=param#fragment"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://api.mastercard.com/test", base_uri)

    def test_url_normalization_add_trailing_slash(self):
        uri = "https://api.mastercard.com"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://api.mastercard.com/", base_uri)

    def test_url_normalization_lowercase_scheme_and_host(self):
        uri = "HTTPS://API.MASTERCARD.COM/TEST"
        base_uri = Util.normalize_url(uri)
        self.assertEqual("https://api.mastercard.com/TEST", base_uri)

    def test_body_hash1(self):
        oauth_parameters = OAuthParameters()
        encoded_hash = Util.base64_encode(
            Util.sha256_encode(OAuth.EMPTY_STRING))
        # print(encoded_hash)
        oauth_parameters.set_oauth_body_hash(encoded_hash)
        self.assertEqual("47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
                         encoded_hash)

    def test_body_hash2(self):
        oauth_parameters = OAuthParameters()
        encoded_hash = Util.base64_encode(Util.sha256_encode(None))
        # print(encoded_hash)
        oauth_parameters.set_oauth_body_hash(encoded_hash)
        self.assertEqual("3JN7WYkmBPWoaslpNs1/8J4l8Yrmt1joAUokx/oDnpE=",
                         encoded_hash)

    def test_body_hash3(self):
        oauth_parameters = OAuthParameters()
        encoded_hash = Util.base64_encode(
            Util.sha256_encode("{\"foõ\":\"bar\"}"))
        # print(encoded_hash)
        oauth_parameters.set_oauth_body_hash(encoded_hash)
        self.assertEqual("+Z+PWW2TJDnPvRcTgol+nKO3LT7xm8smnsg+//XMIyI=",
                         encoded_hash)

    # NOT NEEDED - INTERNAL
    #   @Test(expected = IllegalStateException.class)
    #   public void bodyHash_invalidHashAlgorithm() {
    #     OAuth.getBodyHash(OAuth.EMPTY_STRING, UTF8_CHARSET, "SHA-123");
    #   }

    def test_url_encode1(self):
        self.assertEqual("Format%3DXML", Util.uri_rfc3986_encode("Format=XML"))

    def test_url_encode2(self):
        self.assertEqual(
            "WhqqH%2BTU95VgZMItpdq78BWb4cE%3D",
            Util.uri_rfc3986_encode("WhqqH+TU95VgZMItpdq78BWb4cE="))

    def test_url_encode3(self):
        self.assertEqual(
            "WhqqH%2BTU95VgZMItpdq78BWb4cE%3D%26o",
            Util.uri_rfc3986_encode("WhqqH+TU95VgZMItpdq78BWb4cE=&o"))