Euronet will validate every request is valid or not using signature that calculated using RSA256 algorithm and the secret is secret key that we generated.

Utils.kt

...
override fun getSignature(data: String): String {
        val privateKey = Base64.getDecoder().decode(euronetConfiguration.cms.euronetKey)
        val key = KeyFactory.getInstance("RSA")
        val encoded = PKCS8EncodedKeySpec(privateKey)

        val sign = Signature.getInstance("SHA256withRSA")
        sign.initSign(key.generatePrivate(encoded))
        sign.update(data.toByteArray(Charsets.UTF_8))
        return Base64.getEncoder().encodeToString(sign.sign())
    }
    
...

that method already created within Utils.kt and will generate the signature.

How to use:

We need to convert the object to be json string and pass it as argument of the methods

...
request.signature = signatureService.generateSignature(utils.toStringRequest(request))

results:

{
  "getCardDetailsRequest": {
    "appHeader": {
      "partID": "2500",
      "serviceName": "GETCARDDTL",
      "channelID": "SAFIAPPS",
      "userId": "suser",
      "reqID": "a8d9f2e8-bfa7-46af-a2e7-cc1358d84cb2",
      "reqDateTime": "2022-10-14 10:25:09"
    },
    "cardParams": {
      "cardValueIndicator": "1",
      "proxyCardNumber": "683448986"
    }
  },
  "getCardDetailsResponse": {
    "appHeader": {
      "partID": "2500",
      "serviceName": "GETCARDDTL",
      "channelID": "SAFIAPPS",
      "userId": "suser",
      "reqID": "a8d9f2e8-bfa7-46af-a2e7-cc1358d84cb2",
      "reqDateTime": "2022-10-14 10:25:09"
    },
    "cardParams": {
      "cardValueIndicator": "1",
      "proxyCardNumber": "683448986"
    }
  },
  "signature": "aCbjblg71x9LdvfpjgY4iG5GxZXt3cgBZ3944IgemaP7GFHYjFbX6bFAhBR2xn212ube6XTigpQiWMZucYbM3bxH1OFqjTmfnb3sRdxXHuDtVJQrmQ52BHL6dnOdOZ6xpLr+YVJD/fnKVioi+SA0ybmzeU9rUxFlNDOaVXk3d1t3hv67exc3dRK05BC1SF6xgf2/sRecNXSRFjvx4bYai89mJPUUYd6nT67MvwKVKrNiSiCY3Jo4+QgEZmU8MLTiC08+kB0/aGEcW5Quy4wqqtUIv4jcRUmn3Xl6ld1/1llsVz+/WmkyAsQ/9i//jovt/sjKtFt7SptEDa0HmgLXxg=="
}