From a3ebd99fb6cd5dae08a8d9862b8a6f8a13d052da Mon Sep 17 00:00:00 2001 From: Radek Davidek Date: Tue, 21 Oct 2025 14:54:06 +0200 Subject: [PATCH] added Credentials decoder --- .../migration/util/CredentialsDecoder.java | 49 +++++++++++++++++++ .../resources/apicurio-migrator.properties | 4 +- wso2apim32-pk.pem | 28 +++++++++++ wso2apim45-pk.pem | 28 +++++++++++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cz/trask/migration/util/CredentialsDecoder.java create mode 100644 wso2apim32-pk.pem create mode 100644 wso2apim45-pk.pem diff --git a/src/main/java/cz/trask/migration/util/CredentialsDecoder.java b/src/main/java/cz/trask/migration/util/CredentialsDecoder.java new file mode 100644 index 0000000..9be5e3c --- /dev/null +++ b/src/main/java/cz/trask/migration/util/CredentialsDecoder.java @@ -0,0 +1,49 @@ +package cz.trask.migration.util; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Base64; +import java.util.Map; + +import javax.crypto.Cipher; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.extern.log4j.Log4j2; + +@Log4j2 +public class CredentialsDecoder { + + public static void decodeCredentials(String credentials, String pkFile) throws Exception { + String decodedJson = new String(Base64.getDecoder().decode(credentials)); + log.debug("Decoded JSON: {}", decodedJson); + + ObjectMapper mapper = new ObjectMapper(); + Map jsonMap = mapper.readValue(decodedJson, Map.class); + + String cipherBase64 = jsonMap.get("c"); + String transformation = jsonMap.get("t"); + log.debug("Used algorithm: {}", transformation); + + String privateKeyPEM = new String(Files.readAllBytes(Paths.get(pkFile))) + .replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "") + .replaceAll("\\s+", ""); + byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyPEM); + + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(keySpec); + + byte[] encryptedBytes = Base64.getDecoder().decode(cipherBase64); + Cipher cipher = Cipher.getInstance(transformation); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + String decryptedText = new String(decryptedBytes, "UTF-8"); + + log.debug("Decoded credential: {}", decryptedText); + } +} diff --git a/src/main/resources/apicurio-migrator.properties b/src/main/resources/apicurio-migrator.properties index 9d1e690..be3f6fe 100644 --- a/src/main/resources/apicurio-migrator.properties +++ b/src/main/resources/apicurio-migrator.properties @@ -1,11 +1,13 @@ +# Source WSO2 API Manager v3.2.0 SOURCE_REGISTRATION_API_URL = https://localhost:9443/client-registration/v0.17/register SOURCE_PUBLISHER_API_URL = https://localhost:9443/api/am/publisher SOURCE_DEVPORTAL_API_URL = https://localhost:9443/api/am/store SOURCE_PUBLISHER_TOKEN_URL = https://localhost:9443/oauth2/token SOURCE_WSO2_USER = YWRtaW46YWRtaW4= +# Target WSO2 API Manager v4.5.0 TARGET_REGISTRATION_API_URL = https://localhost:9443/client-registration/v0.17/register -TARGET_PUBLISHER_API_URL = https://localhost:9443/api/am/publisher/v3/apis/import +TARGET_PUBLISHER_API_URL = https://localhost:9443/api/am/publisher/v4/apis/import TARGET_DEVPORTAL_API_URL = https://localhost:9443/api/am/devportal TARGET_PUBLISHER_TOKEN_URL = https://localhost:9443/oauth2/token TARGET_WSO2_USER = YWRtaW46YWRtaW4= diff --git a/wso2apim32-pk.pem b/wso2apim32-pk.pem new file mode 100644 index 0000000..c5d82cf --- /dev/null +++ b/wso2apim32-pk.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDF6qhlhtD9KvwM +4VD7+psRsKnpXNvmHMfuhreF/YVnFEoXQfpvwI4zPPz7Sa8R1hW9v/fWMwQvYIhC +GRBGiXUiu4PqcE6aSO5clIF+JySUxolk5GG4KsHiugfHOgbX1paaxwDSCd8Eqjag +ZdKMmadnEiH7ZfqzIcJ/IxlnTQvMPKuChdZBfIW8IDZrHnizuwqIc4zc/gD1bhBT +CagSLgdCY+AmMgzh4ZU+HQa0gA034E5DUqRQjs7O14cJMu7dWPEzSzDxBFrJl2Ge +I8X5T2fd9rWY7gosGxbiYMuODxH8m4AZNf9IQQaPQHkdZAA/qbLEoXPbHANoIa9P +6t2+SS07AgMBAAECggEAGN1RuauVzvCbCN03yOhjmfXZat2FLOQ5xAA9x0IiA+C7 +LC/YUDjfRJWpbMKFkZaVVajr8IepQ3B7vd4bOtljE3F+cbIZVe3KsGvh1uEBCgXl +Vf0RP8tzX1Iizwc9u9kUQ66zri+aSqI9yanxKUPWka7oAQb/V4jqwAE/XEiELmzK +R/KSIWo/4msCfgnkHBLXyD4vE8iIotsSep7fh7kOJjfj4jqEJ8h1ojFiLtxDkjtn +y9EkQ3+jJTXf8YgebCaJI3iLplNETWyqJIuvWDh9ivqHR3pZFXhaEWIJabddOZW4 +lth/oja1D17W73X8dpL6VqA5+ahVMg/oO7T57ps6CQKBgQDlS8avs8B6NZkAW8wS +vBQ/0eVnF1/wZ+swSsk/05MgSFcMdVe1Fb+WfaFpv+GlGhihNj5WX5bQzvSNh49d +9fWUp4/EI9NUyezxOcEnnoehELTuMY9L/m6HBL2s5jowOwI9h537Ye+Ty+qWezI1 +uPl8IDlspoRtjrsUmhSKP5IB8wKBgQDc91aRjxNEA+1uNh0GAGPWslPmv5z2oAU0 +VWGQCjoles2I9NL+Qdxlrce7O2cIedh3DVR6Ep0mqGBNvSXkQSNNT3Aldr3OZj2s +6DkFLi7u6XyZD2vIxWRRQPV5fAN9x6nTsNrFfY6VSfAgKADijwnbFk/J1RzyEqON +Tk7p/t+xmQKBgQCuhRtHdd/E5HB8hmHvzHj5Di+1ZGQgHWgzjGhajRVJF+YxVEqa +SGBXEW2+iE4dFJy0bw3JPd4TNcGKyyfCk0cEivhwh/f8a+hMvfGWzyFZ5NZhCRWQ ++Kl1WJVpOJ4HQZJ19He48pSfgDAfssrHeu9gm0I5wQ/AN0eK6a9CfhoKIwKBgQDQ +o7aY4EinqzGwI+ZJuWqL2XwBYCHceQIRBSGG+TEoHIkf7VOggh2R4IG8F33U8f/j +gbGnRhYe31N3c8bofFzR7dUNes4DqmRH9EmKy63DJrHgcEAspb1wP27JU8CULkf7 +u30GhuRvsA3Mvxj+02LR/IJAKDsZk2Hc1fkLVv5u2QKBgQCIMfG+LcnFwIzuy+NT +A4PLkbwiNfVGRQ9wca00BP5VXDUjFd6u2MW2YDG36gixxknQqWHMKiz457pWu6dW +UHtQ8DT+xT60pJl5OeOL9LKkV+3+NrNzIE6zi3A6Nz8Q35t3u56VN4gA9mT/zNqr +k7C/Z4klVgt5GHzPgHxu9VlmCQ== +-----END PRIVATE KEY----- diff --git a/wso2apim45-pk.pem b/wso2apim45-pk.pem new file mode 100644 index 0000000..73e4cb1 --- /dev/null +++ b/wso2apim45-pk.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCv08/Rb7tTM3kS +fWJRD4ATrK/qADT8gRnx3iVMtySb1Tl4S7ui1xVKZQnz1qnoXi6TCFMTai1XYt7n +jX26l/WYp/gDaceZvhbcJI+cHEzwp4w664ZzuS00Ma6LfXracudR4FVrtolOZTHk +aCOMAHYnYMHSnGSkQhHrkcnUl3sy9AhlhKd7XQOf/7CeZYsmdcawdvOpBCaynhgz +ieYk+YcC2HSU3ND5XSBfB0nv27FgJQ/zWEANqAsSBdb3vzD3jmi/JHwYrcrdekba +ez5J4kL5u8lVnDjHJDJ7AGvfLT6ph1KeMPb7g7cgoaMbmNmMeFdHoqokUCQXSa/o +vSgWVLyjAgMBAAECggEABdV600GoTwHptf3YCcWAY+a6bYK1P12PPVG4HhwDiHIi +NoYYwzXsvGuu0Vrhh1a8p99CVmYS/A/JQpiUv+Cz4u1L0t0rJMREYOiLpUvhF6kP +g5L2Apf10oIFfxZaQa5HU5Wkb+7+Dk5YQfJcn5QSV4sj0zeiNTsF+jF7p2ShT1bw +Wp6rt2qCBASvdnwk1hrtneEtF3Gj7eBBMBYEqbCrpc4lItWaGG05ihqIJuP3WulY +7eF+M5Qj4vDe0w1tfeQc9RHJUfHkODsHyWKBH/qHL7FfHFrh+qlt1rwN94BbyPV3 +PYEQ9a9lawdy1ExVG8pEMfUSyRORo8Ium66EyomCLQKBgQDrbSzbw8HixYlQn4dN +UJsAmbmcgikmKEp1ca+v4N/WvZhlzdktxxOB3CFDq29vZjcxHYNlalhbsUXjIDfV +zvmi1ywJaEuEnatnYxim9F2JTFOuPQgI+oIXRrG196Cs7gh70Pg07csXuqPPFaH8 +CoVHZFq9auSgPdmAn9an3isXVQKBgQC/MVIL3m4L5QjFsVTfrq3GhgRkjwSEKJc0 +Sb7PlR3yJG2vLzwJndp83Hs3BBIMisUYq/z9W/ySs5mo262r4e6PBfZmmDmFZWSP +82+3edHRX6PvVVPPFJNy85HKvF0IP1JQei/uwr7KjfnXlcAS4gfIsdzDcWMwk7SK +qGwCAhcUFwKBgCg56VZLpo9W7VWHTJkbUsDRg3OIkfthGwfiOwC0TcrlbmrGt3so +7t5bfJuRaWMBdiDASDlF6H8SVTyvvpqb2O/IEFAzL+QjBKyPtCCi1HCnSA0XhI30 +L9JGVAshmqSxr2VomWCB2Rfe3ip+KcVlDszaCt8eqp3us4FUzlq0jWxZAoGAE8eK +cWflgp2DNtCNs0Zi+/LJaY3SLcn1OpeWgesvWemi30jHsUb/X4N/y8VECMAie9bv +KVbm3lZuQyXW5b1N7MX1I9ADw2Ul7i6FFDoqFrsKPqxZK0c5qd7A6nRqO3wxi9nY +M586FcJyYnc/k7SGkaC08hM8672cI+wgoGSO9qkCgYBPlLR7GO+wJCcPNUnMLc68 +oQXjpL+gtIU64xr595OMwPyFiM8lHBJXlVhkIb5mKB/sYtMy/TVbgBp18K6yHrBg +cG3K5P/M4fT2x94TDfE88Rw5vmWuuLj5Sp3M59TaUu3msAsNIqeqqLTIMxed4k46 +MkB36R3/CBxgp135HreFzA== +-----END PRIVATE KEY-----