diff --git a/GeneXusCryptography/pom.xml b/GeneXusCryptography/pom.xml
index f41023b..39c31f5 100644
--- a/GeneXusCryptography/pom.xml
+++ b/GeneXusCryptography/pom.xml
@@ -7,7 +7,7 @@
com.genexus
SecurityAPIParent
- 1.0.0.3
+ 16.11.0
diff --git a/GeneXusFtps/pom.xml b/GeneXusFtps/pom.xml
index ea2500f..eeb6dd4 100644
--- a/GeneXusFtps/pom.xml
+++ b/GeneXusFtps/pom.xml
@@ -8,7 +8,7 @@
com.genexus
SecurityAPIParent
- 1.0.0.3
+ 16.11.0
diff --git a/GeneXusJWT/pom.xml b/GeneXusJWT/pom.xml
index 9b29790..361c5f3 100644
--- a/GeneXusJWT/pom.xml
+++ b/GeneXusJWT/pom.xml
@@ -7,7 +7,7 @@
com.genexus
SecurityAPIParent
- 1.0.0.3
+ 16.11.0
@@ -26,25 +26,25 @@
com.auth0
java-jwt
- 3.9.0
+ 3.10.3
com.fasterxml.jackson.core
jackson-databind
- 2.9.10.4
+ 2.11.0
com.fasterxml.jackson.core
jackson-annotations
- 2.9.9
+ 2.11.0
com.fasterxml.jackson.core
jackson-core
- 2.9.9
+ 2.11.0
diff --git a/GeneXusJWT/src/main/java/com/genexus/JWT/JWTCreator.java b/GeneXusJWT/src/main/java/com/genexus/JWT/JWTCreator.java
index a4fc6f2..416af06 100644
--- a/GeneXusJWT/src/main/java/com/genexus/JWT/JWTCreator.java
+++ b/GeneXusJWT/src/main/java/com/genexus/JWT/JWTCreator.java
@@ -1,5 +1,7 @@
package com.genexus.JWT;
+import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -11,7 +13,10 @@
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import com.auth0.jwt.interfaces.Verification;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.genexus.JWT.claims.Claim;
+import com.genexus.JWT.claims.HeaderParameters;
import com.genexus.JWT.claims.PrivateClaims;
import com.genexus.JWT.claims.PublicClaims;
import com.genexus.JWT.claims.RegisteredClaim;
@@ -25,17 +30,18 @@
import com.genexus.securityapicommons.keys.PrivateKeyManager;
import com.genexus.securityapicommons.utils.SecurityUtils;
-
-
public class JWTCreator extends JWTObject {
+ private int counter;
+
public JWTCreator() {
super();
EncodingUtil eu = new EncodingUtil();
eu.setEncoding("UTF8");
-
+ this.counter = 0;
+
}
-
+
/******** EXTERNAL OBJECT PUBLIC METHODS - BEGIN ********/
public String doCreate(String algorithm, PrivateClaims privateClaims, JWTOptions options) {
if (options.hasError()) {
@@ -47,6 +53,10 @@ public String doCreate(String algorithm, PrivateClaims privateClaims, JWTOptions
return "";
}
Builder tokenBuilder = JWT.create();
+ if (!options.getHeaderParameters().isEmpty()) {
+ HeaderParameters parameters = options.getHeaderParameters();
+ tokenBuilder.withHeader(parameters.getMap());
+ }
tokenBuilder = doBuildPayload(tokenBuilder, privateClaims, options);
if (this.hasError()) {
return "";
@@ -98,7 +108,8 @@ public boolean doVerify(String token, String expectedAlgorithm, PrivateClaims pr
this.error.setError("JW005", e.getMessage());
return false;
}
- if (isRevoqued(decodedJWT, options) || !verifyPrivateClaims(decodedJWT, privateClaims)) {
+ if (isRevoqued(decodedJWT, options) || !verifyPrivateClaims(decodedJWT, privateClaims, options)
+ || !verifyHeader(decodedJWT, options)) {
return false;
}
String algorithm = decodedJWT.getAlgorithm();
@@ -107,12 +118,11 @@ public boolean doVerify(String token, String expectedAlgorithm, PrivateClaims pr
return false;
}
JWTAlgorithm expectedJWTAlgorithm = JWTAlgorithm.getJWTAlgorithm(expectedAlgorithm, this.error);
- if(alg.compareTo(expectedJWTAlgorithm) != 0 || this.hasError())
- {
- this.error.setError("JW008", "Expected algorithm does not match token algorithm");
- return false;
- }
-
+ if (alg.compareTo(expectedJWTAlgorithm) != 0 || this.hasError()) {
+ this.error.setError("JW008", "Expected algorithm does not match token algorithm");
+ return false;
+ }
+
Algorithm algorithmType = null;
if (JWTAlgorithm.isPrivate(alg)) {
CertificateX509 cert = options.getCertificate();
@@ -150,7 +160,7 @@ public boolean doVerify(String token, String expectedAlgorithm, PrivateClaims pr
error.setError("JW006", e.getMessage());
return false;
}
-
+
return true;
}
@@ -236,7 +246,11 @@ private Builder doBuildPayload(Builder tokenBuilder, PrivateClaims privateClaims
List privateC = privateClaims.getAllClaims();
for (int i = 0; i < privateC.size(); i++) {
try {
- tokenBuilder.withClaim(privateC.get(i).getKey(), privateC.get(i).getValue());
+ if (privateC.get(i).getNestedClaims() != null) {
+ tokenBuilder.withClaim(privateC.get(i).getKey(), privateC.get(i).getNestedClaims().getNestedMap());
+ } else {
+ tokenBuilder.withClaim(privateC.get(i).getKey(), privateC.get(i).getValue());
+ }
} catch (Exception e) {
this.error.setError("JW004", e.getMessage());
return null;
@@ -275,32 +289,157 @@ private Builder doBuildPayload(Builder tokenBuilder, PrivateClaims privateClaims
// ****END BUILD PAYLOAD****//
return tokenBuilder;
}
-
- private boolean verifyPrivateClaims(DecodedJWT decodedJWT, PrivateClaims privateClaims)
- {
- if(privateClaims == null || privateClaims.isEmpty())
- {
+
+ private boolean verifyPrivateClaims(DecodedJWT decodedJWT, PrivateClaims privateClaims, JWTOptions options) {
+ RegisteredClaims registeredClaims = options.getAllRegisteredClaims();
+ PublicClaims publicClaims = options.getAllPublicClaims();
+ if (privateClaims == null || privateClaims.isEmpty()) {
+ return true;
+ }
+ String base64Part = decodedJWT.getPayload();
+ byte[] base64Bytes = Base64.decodeBase64(base64Part);
+ EncodingUtil eu = new EncodingUtil();
+ String plainTextPart = eu.getString(base64Bytes);
+ HashMap map = new HashMap();
+ ObjectMapper mapper = new ObjectMapper();
+
+ try {
+ map = (HashMap) mapper.readValue(plainTextPart, new TypeReference