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>() { + }); + } catch (Exception e) { + this.error.setError("JW009", "Cannot parse JWT payload"); + return false; + } + this.counter = 0; + boolean validation = verifyNestedClaims(privateClaims.getNestedMap(), map, registeredClaims, publicClaims); + int pClaimsCount = countingPrivateClaims(privateClaims.getNestedMap(), 0); + if (validation && !(this.counter == pClaimsCount)) { + return false; + } + return validation; + } + + private boolean verifyNestedClaims(Map pclaimMap, Map map, + RegisteredClaims registeredClaims, PublicClaims publicClaims) { + List mapClaimKeyList = new ArrayList(map.keySet()); + List pClaimKeyList = new ArrayList(pclaimMap.keySet()); + if (pClaimKeyList.size() > pClaimKeyList.size()) { + return false; + } + for (String mapKey : mapClaimKeyList) { + + if (!isRegistered(mapKey, registeredClaims) && !isPublic(mapKey, publicClaims)) { + + this.counter++; + if (!pclaimMap.containsKey(mapKey)) { + return false; + } + + Object op = pclaimMap.get(mapKey); + Object ot = map.get(mapKey); + + if (op instanceof String && ot instanceof String) { + + if (!SecurityUtils.compareStrings(((String) op).trim(), ((String) ot).trim())) { + return false; + } + } else if (op instanceof HashMap && ot instanceof HashMap) { + @SuppressWarnings("unchecked") + boolean flag = verifyNestedClaims((HashMap) op, (HashMap) ot, + registeredClaims, publicClaims); + if (!flag) { + return false; + } + } else { + return false; + } + } + } + return true; + } + + private boolean isRegistered(String claimKey, RegisteredClaims registeredClaims) { + + List registeredClaimsList = registeredClaims.getAllClaims(); + for (Claim s : registeredClaimsList) { + if (SecurityUtils.compareStrings(s.getKey().trim(), claimKey.trim())) { + return true; + } + } + return false; + } + + private boolean isPublic(String claimKey, PublicClaims publicClaims) { + List publicClaimsList = publicClaims.getAllClaims(); + for (Claim s : publicClaimsList) { + if (SecurityUtils.compareStrings(s.getKey().trim(), claimKey.trim())) { + return true; + } + } + return false; + } + + @SuppressWarnings("unchecked") + private int countingPrivateClaims(Map map, int counter) { + List list = new ArrayList(map.keySet()); + for (String s : list) { + counter++; + Object obj = map.get(s); + if (obj instanceof HashMap) { + counter = countingPrivateClaims((HashMap) obj, counter); + } + } + return counter; + } + + private boolean verifyHeader(DecodedJWT decodedJWT, JWTOptions options) { + HeaderParameters parameters = options.getHeaderParameters(); + if (parameters.isEmpty()) { return true; } - Map map = decodedJWT.getClaims(); - - List claims = privateClaims.getAllClaims(); - for(int i= 0; i < claims.size(); i++) - { - Claim c = claims.get(i); - if(!map.containsKey(c.getKey())) - { + + List allParms = parameters.getAll(); + if (allParms.size() + 2 != getHeaderClaimsNumber(decodedJWT)) { + return false; + } + Map map = parameters.getMap(); + for (String s : allParms) { + + if (decodedJWT.getHeaderClaim(s) == null) { return false; } - com.auth0.jwt.interfaces.Claim claim = map.get(c.getKey()); - if(!SecurityUtils.compareStrings(claim.asString().trim(), c.getValue().trim())) - { + com.auth0.jwt.interfaces.Claim c = decodedJWT.getHeaderClaim(s); + String claimValue = null; + try { + claimValue = c.asString().trim(); + } catch (NullPointerException e) { + return false; + } + String optionsValue = ((String) map.get(s)).trim(); + if (!SecurityUtils.compareStrings(claimValue, optionsValue)) { return false; } } return true; + } - + private int getHeaderClaimsNumber(DecodedJWT decodedJWT) { + String base64Part = decodedJWT.getHeader(); + 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>() { + }); + } catch (Exception e) { + return 0; + } + return map.size(); + + } } diff --git a/GeneXusJWT/src/main/java/com/genexus/JWT/claims/Claim.java b/GeneXusJWT/src/main/java/com/genexus/JWT/claims/Claim.java index 1e844d9..7d2cdc5 100644 --- a/GeneXusJWT/src/main/java/com/genexus/JWT/claims/Claim.java +++ b/GeneXusJWT/src/main/java/com/genexus/JWT/claims/Claim.java @@ -3,15 +3,27 @@ public class Claim { private String key; - private String value; + private Object value; - public Claim(String valueKey, String valueOfValue) { + public Claim(String valueKey, Object valueOfValue) { key = valueKey; value = valueOfValue; - } + } public String getValue() { - return value; + if (value instanceof String) { + return (String) value; + } else { + return null; + } + } + + public PrivateClaims getNestedClaims() { + if (value instanceof PrivateClaims) { + return (PrivateClaims) value; + } else { + return null; + } } public String getKey() { diff --git a/GeneXusJWT/src/main/java/com/genexus/JWT/claims/Claims.java b/GeneXusJWT/src/main/java/com/genexus/JWT/claims/Claims.java index bfcc10f..32f01f7 100644 --- a/GeneXusJWT/src/main/java/com/genexus/JWT/claims/Claims.java +++ b/GeneXusJWT/src/main/java/com/genexus/JWT/claims/Claims.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.List; -import com.genexus.JWT.utils.JWTUtils; import com.genexus.securityapicommons.commons.Error; import com.genexus.securityapicommons.utils.SecurityUtils; @@ -13,9 +12,9 @@ public class Claims { public Claims() { claims = new ArrayList(); - } + } - public boolean setClaim(String key, String value, Error error) { + public boolean setClaim(String key, Object value, Error error) { Claim claim = new Claim(key, value); claims.add(claim); return true; diff --git a/GeneXusJWT/src/main/java/com/genexus/JWT/claims/HeaderParameters.java b/GeneXusJWT/src/main/java/com/genexus/JWT/claims/HeaderParameters.java new file mode 100644 index 0000000..3a1d288 --- /dev/null +++ b/GeneXusJWT/src/main/java/com/genexus/JWT/claims/HeaderParameters.java @@ -0,0 +1,41 @@ +package com.genexus.JWT.claims; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class HeaderParameters { + /* + * Cannot avoid typ=JWT because of RFC 7519 https://tools.ietf.org/html/rfc7519 + * https://github.com/auth0/java-jwt/issues/369 + */ + + private Map map; + + public HeaderParameters() { + map = new HashMap(); + } + + public void setParameter(String name, String value) { + map.put(name, value); + } + + public Map getMap() { + return this.map; + } + + public List getAll() { + return new ArrayList(map.keySet()); + } + + public boolean isEmpty() + { + if (getAll().size() == 0) + { + return true; + } + return false; + } + +} diff --git a/GeneXusJWT/src/main/java/com/genexus/JWT/claims/PrivateClaims.java b/GeneXusJWT/src/main/java/com/genexus/JWT/claims/PrivateClaims.java index 4df21d9..422fe05 100644 --- a/GeneXusJWT/src/main/java/com/genexus/JWT/claims/PrivateClaims.java +++ b/GeneXusJWT/src/main/java/com/genexus/JWT/claims/PrivateClaims.java @@ -1,6 +1,8 @@ package com.genexus.JWT.claims; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.genexus.securityapicommons.commons.Error; @@ -8,11 +10,33 @@ public final class PrivateClaims extends Claims { private List claims; + public PrivateClaims() { super(); + } - + public boolean setClaim(String key, String value) { return super.setClaim(key, value, new Error()); } + + public boolean setClaim(String key, PrivateClaims value) + { + + return super.setClaim(key, value, new Error()); + } + + public Map getNestedMap() { + HashMap result = new HashMap(); + for (Claim c : getAllClaims()) { + if (c.getValue() != null) { + result.put(c.getKey(), c.getValue()); + } else { + result.put(c.getKey(), ((PrivateClaims) c.getNestedClaims()).getNestedMap()); + } + } + + return result; + } + } diff --git a/GeneXusJWT/src/main/java/com/genexus/JWT/claims/RegisteredClaims.java b/GeneXusJWT/src/main/java/com/genexus/JWT/claims/RegisteredClaims.java index e8d990d..c98c49b 100644 --- a/GeneXusJWT/src/main/java/com/genexus/JWT/claims/RegisteredClaims.java +++ b/GeneXusJWT/src/main/java/com/genexus/JWT/claims/RegisteredClaims.java @@ -3,7 +3,6 @@ import java.util.HashMap; import java.util.List; -import com.genexus.JWT.utils.JWTUtils; import com.genexus.securityapicommons.commons.Error; import com.genexus.securityapicommons.utils.SecurityUtils; @@ -15,10 +14,15 @@ public final class RegisteredClaims extends Claims { public RegisteredClaims() { super(); customTimeValidationClaims = new HashMap(); - + } @Override + public boolean setClaim(String key, Object value, Error error) { + error.setError("RC001", "Not alllowed data type"); + return false; + } + public boolean setClaim(String key, String value, Error error) { if (RegisteredClaim.exists(key)) { return super.setClaim(key, value, error); diff --git a/GeneXusJWT/src/main/java/com/genexus/JWT/utils/DateUtil.java b/GeneXusJWT/src/main/java/com/genexus/JWT/utils/DateUtil.java index 21f8175..fc55944 100644 --- a/GeneXusJWT/src/main/java/com/genexus/JWT/utils/DateUtil.java +++ b/GeneXusJWT/src/main/java/com/genexus/JWT/utils/DateUtil.java @@ -5,28 +5,50 @@ import com.genexus.commons.DateUtilObject; -public final class DateUtil extends DateUtilObject{ +/***** DEPRECATED OBJECT SINCE GeneXus 16 upgrade 11 ******/ + +public final class DateUtil extends DateUtilObject { /******** EXTERNAL OBJECT PUBLIC METHODS - BEGIN ********/ + + /** + * @deprecated DateUtil object is deprecated. Use GeneXus DateTime data type + * instead + * https://wiki.genexus.com/commwiki/servlet/wiki?7370,DateTime%20data%20type + */ + @Deprecated public String getCurrentDate() { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); LocalDateTime now = LocalDateTime.now(); return dtf.format(now); } - + + /** + * @deprecated DateUtil object is deprecated. Use GeneXus DateTime data type + * instead + * https://wiki.genexus.com/commwiki/servlet/wiki?7370,DateTime%20data%20type + */ + @Deprecated public String currentPlusSeconds(long seconds) { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); LocalDateTime now = LocalDateTime.now(); - now.plusSeconds(seconds); - return dtf.format(now); + LocalDateTime aux = now.plusSeconds(seconds); + return dtf.format(aux); } - + + /** + * @deprecated DateUtil object is deprecated. Use GeneXus DateTime data type + * instead + * https://wiki.genexus.com/commwiki/servlet/wiki?7370,DateTime%20data%20type + */ + @Deprecated public String currentMinusSeconds(long seconds) { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); LocalDateTime now = LocalDateTime.now(); - now.minusSeconds(seconds); - return dtf.format(now); + LocalDateTime aux = now.minusSeconds(seconds); + return dtf.format(aux); } + /******** EXTERNAL OBJECT PUBLIC METHODS - END ********/ } diff --git a/GeneXusJWT/src/main/java/com/genexus/JWT/utils/GUID.java b/GeneXusJWT/src/main/java/com/genexus/JWT/utils/GUID.java index dd86c31..30b0ce2 100644 --- a/GeneXusJWT/src/main/java/com/genexus/JWT/utils/GUID.java +++ b/GeneXusJWT/src/main/java/com/genexus/JWT/utils/GUID.java @@ -4,9 +4,16 @@ import com.genexus.commons.GUIDObject; -public final class GUID extends GUIDObject{ +/***** DEPRECATED OBJECT SINCE GeneXus 16 upgrade 11 ******/ + +public final class GUID extends GUIDObject { /******** EXTERNAL OBJECT PUBLIC METHODS - BEGIN ********/ + /** + * @deprecated GUID object is deprecated. USe Genexus GUID data type instead + * https://wiki.genexus.com/commwiki/servlet/wiki?31772,GUID+data+type + */ + @Deprecated public String generate() { UUID uuid = UUID.randomUUID(); diff --git a/GeneXusJWT/src/main/java/com/genexus/commons/JWTOptions.java b/GeneXusJWT/src/main/java/com/genexus/commons/JWTOptions.java index 4d485a6..56cd107 100644 --- a/GeneXusJWT/src/main/java/com/genexus/commons/JWTOptions.java +++ b/GeneXusJWT/src/main/java/com/genexus/commons/JWTOptions.java @@ -2,6 +2,7 @@ import org.bouncycastle.util.encoders.Hex; +import com.genexus.JWT.claims.HeaderParameters; import com.genexus.JWT.claims.PublicClaims; import com.genexus.JWT.claims.RegisteredClaims; import com.genexus.JWT.utils.RevocationList; @@ -18,11 +19,13 @@ public class JWTOptions extends SecurityAPIObject { private RevocationList revocationList; private CertificateX509 certificate; private PrivateKeyManager privateKey; + private HeaderParameters parameters; public JWTOptions() { publicClaims = new PublicClaims(); registeredClaims = new RegisteredClaims(); revocationList = new RevocationList(); + parameters = new HeaderParameters(); } /******** EXTERNAL OBJECT PUBLIC METHODS - BEGIN ********/ @@ -70,6 +73,12 @@ public void addRevocationList(RevocationList revocationList) { public void deteleRevocationList() { this.revocationList = new RevocationList(); } + + public void addHeaderParameter(String name, String value) + { + this.parameters.setParameter(name, value); + } + /******** EXTERNAL OBJECT PUBLIC METHODS - END ********/ @@ -113,4 +122,9 @@ public CertificateX509 getCertificate() { public PrivateKeyManager getPrivateKey() { return this.privateKey; } + + public HeaderParameters getHeaderParameters() + { + return this.parameters; + } } diff --git a/GeneXusSftp/pom.xml b/GeneXusSftp/pom.xml index 85e41d2..796d502 100644 --- a/GeneXusSftp/pom.xml +++ b/GeneXusSftp/pom.xml @@ -7,7 +7,7 @@ com.genexus SecurityAPIParent - 1.0.0.3 + 16.11.0 diff --git a/GeneXusXmlSignature/pom.xml b/GeneXusXmlSignature/pom.xml index 964f737..fa2dd36 100644 --- a/GeneXusXmlSignature/pom.xml +++ b/GeneXusXmlSignature/pom.xml @@ -7,7 +7,7 @@ com.genexus SecurityAPIParent - 1.0.0.3 + 16.11.0 GeneXusXmlSignature diff --git a/SecurityAPICommons/pom.xml b/SecurityAPICommons/pom.xml index cbcd196..47c4503 100644 --- a/SecurityAPICommons/pom.xml +++ b/SecurityAPICommons/pom.xml @@ -7,7 +7,7 @@ com.genexus SecurityAPIParent - 1.0.0.3 + 16.11.0 diff --git a/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/keys/CertificateX509.java b/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/keys/CertificateX509.java index 54c0d27..10143b9 100644 --- a/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/keys/CertificateX509.java +++ b/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/keys/CertificateX509.java @@ -269,7 +269,7 @@ private boolean loadPublicKeyFromFile(String path, String alias, String password return result; } if (SecurityUtils.extensionIs(path, ".pfx") || SecurityUtils.extensionIs(path, ".p12") - || SecurityUtils.extensionIs(path, ".jks")) { + || SecurityUtils.extensionIs(path, ".jks") || SecurityUtils.extensionIs(path, ".pkcs12")) { result = loadPublicKeyFromPKCS12File(path, alias, password); return result; } diff --git a/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/keys/PrivateKeyManager.java b/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/keys/PrivateKeyManager.java index 895550b..1ad5822 100644 --- a/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/keys/PrivateKeyManager.java +++ b/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/keys/PrivateKeyManager.java @@ -245,11 +245,11 @@ private boolean loadKeyFromFile(String path, String alias, String password) thro */ private boolean loadPrivateKeyFromFile(String path, String alias, String password) throws CertificateException, IOException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException { - if (SecurityUtils.extensionIs(path, ".pem")) { + if (SecurityUtils.extensionIs(path, ".pem") || SecurityUtils.extensionIs(path, ".key")) { return this.hasPrivateKey = loadPrivateKeyFromPEMFile(path); } if (SecurityUtils.extensionIs(path, ".pfx") || SecurityUtils.extensionIs(path, ".p12") - || SecurityUtils.extensionIs(path, ".jks")) { + || SecurityUtils.extensionIs(path, ".jks") || SecurityUtils.extensionIs(path, ".pkcs12")) { return this.hasPrivateKey = loadPrivateKeyFromPKCS12File(path, alias, password); } this.error.setError("PK014", "Error loading private key"); diff --git a/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/utils/SecurityUtils.java b/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/utils/SecurityUtils.java index 45b51a4..67fa30c 100644 --- a/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/utils/SecurityUtils.java +++ b/SecurityAPICommons/src/main/java/com/genexus/securityapicommons/utils/SecurityUtils.java @@ -14,8 +14,11 @@ public class SecurityUtils { public static boolean compareStrings(String one, String two) { - return one.compareToIgnoreCase(two) == 0; - + if (one != null && two != null) { + return one.compareToIgnoreCase(two) == 0; + } else { + return false; + } } diff --git a/pom.xml b/pom.xml index 6a7c4b1..b464a99 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.genexus SecurityAPIParent - 1.0.0.3 + 16.11.0 pom GeneXusSecurityAPI (Parent)