Skip to content

Commit 07b049c

Browse files
sgramponeBeta Bot
authored andcommitted
Cherry pick branch 'genexuslabs:gamutils_eo' into beta
1 parent 87d26ce commit 07b049c

File tree

6 files changed

+170
-70
lines changed

6 files changed

+170
-70
lines changed

gamutils/src/main/java/com/genexus/gam/GamUtilsEO.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,27 +57,19 @@ public static String getJwkAlgorithm(String jwkString) {
5757
}
5858

5959
//**JWT**//
60-
public static boolean verifyJwtRsa(String path, String alias, String password, String token) {
61-
return Jwt.verify(path, alias, password, token, "", false);
60+
public static boolean verifyJwt(String path, String alias, String password, String token) {
61+
return Jwt.verify(path, alias, password, token);
6262
}
6363

64-
public static String createJwtRsa(String path, String alias, String password, String payload, String header) {
65-
return Jwt.create(path, alias, password, payload, header, "", false);
66-
}
67-
68-
public static boolean verifyJwtSha(String secret, String token) {
69-
return Jwt.verify("", "", "", token, secret, true);
64+
public static String createJwt(String path, String alias, String password, String payload, String header) {
65+
return Jwt.create(path, alias, password, payload, header);
7066
}
7167

7268
public static boolean verifyAlgorithm(String expectedAlgorithm, String token)
7369
{
7470
return Jwt.verifyAlgorithm(expectedAlgorithm, token);
7571
}
7672

77-
public static String createJwtSha(String secret, String payload, String header) {
78-
return Jwt.create("", "", "", payload, header, secret, true);
79-
}
80-
8173
public static long createUnixTimestamp(Date date) {
8274
return UnixTimestamp.create(date);
8375
}
@@ -97,5 +89,9 @@ public static String base64ToBase64Url(String base64) {
9789

9890
public static String hexaToBase64(String hexa) { return Encoding.hexaToBase64(hexa); }
9991

92+
public static String toBase64Url(String input) { return Encoding.toBase64Url(input); }
93+
94+
public static String fromBase64Url(String base64) { return Encoding.fromBase64Url(base64); }
95+
10096
/********EXTERNAL OBJECT PUBLIC METHODS - END ********/
10197
}

gamutils/src/main/java/com/genexus/gam/utils/Encoding.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.genexus.gam.utils;
22

33

4+
import com.nimbusds.jose.util.Base64URL;
45
import org.apache.logging.log4j.LogManager;
56
import org.apache.logging.log4j.Logger;
67
import org.bouncycastle.util.encoders.Base64;
78
import org.bouncycastle.util.encoders.Hex;
89
import org.bouncycastle.util.encoders.UrlBase64;
910

11+
import java.nio.charset.StandardCharsets;
12+
1013
public class Encoding {
1114

1215
private static final Logger logger = LogManager.getLogger(Encoding.class);
@@ -32,4 +35,28 @@ public static String hexaToBase64(String hexa)
3235
return "";
3336
}
3437
}
38+
39+
public static String toBase64Url(String input)
40+
{
41+
logger.debug("UTF8toBase64Url");
42+
try{
43+
return new String(UrlBase64.encode(input.getBytes(StandardCharsets.UTF_8)));
44+
}catch (Exception e)
45+
{
46+
logger.error("UTF8toBase64Url", e);
47+
return "";
48+
}
49+
}
50+
51+
public static String fromBase64Url(String base64Url)
52+
{
53+
logger.debug("fromBase64Url");
54+
try{
55+
return new String(UrlBase64.decode(base64Url), StandardCharsets.UTF_8);
56+
}catch (Exception e)
57+
{
58+
logger.error("fromBase64Url", e);
59+
return "";
60+
}
61+
}
3562
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.genexus.gam.utils.json;
2+
3+
import com.nimbusds.jose.JWSAlgorithm;
4+
import org.apache.logging.log4j.LogManager;
5+
import org.apache.logging.log4j.Logger;
6+
7+
public enum JWTAlgorithm {
8+
9+
HS256, HS512, HS384, RS256, RS512;
10+
11+
private static final Logger logger = LogManager.getLogger(JWTAlgorithm.class);
12+
13+
public static JWSAlgorithm getJWSAlgorithm(JWTAlgorithm alg)
14+
{
15+
logger.debug("getJWSAlgorithm");
16+
switch (alg)
17+
{
18+
case HS256:
19+
return JWSAlgorithm.HS256;
20+
case HS512:
21+
return JWSAlgorithm.HS512;
22+
case HS384:
23+
return JWSAlgorithm.HS384;
24+
case RS256:
25+
return JWSAlgorithm.RS256;
26+
case RS512:
27+
return JWSAlgorithm.RS512;
28+
default:
29+
logger.error("getJWSAlgorithm - not implemented algorithm");
30+
return null;
31+
}
32+
}
33+
34+
public static JWTAlgorithm getJWTAlgoritm(String alg)
35+
{
36+
logger.debug("getJWTAlgoritm");
37+
switch (alg.trim().toUpperCase())
38+
{
39+
case "HS256":
40+
return JWTAlgorithm.HS256;
41+
case "HS512":
42+
return JWTAlgorithm.HS512;
43+
case "HS384":
44+
return JWTAlgorithm.HS384;
45+
case "RS256":
46+
return JWTAlgorithm.RS256;
47+
case "RS512":
48+
return JWTAlgorithm.RS512;
49+
default:
50+
logger.error("getJWTAlgoritm- not implemented algorithm");
51+
return null;
52+
}
53+
}
54+
55+
public static boolean isSymmetric(JWTAlgorithm alg)
56+
{
57+
logger.debug("isSymmetric");
58+
switch (alg)
59+
{
60+
case HS256:
61+
case HS384:
62+
case HS512:
63+
return true;
64+
case RS256:
65+
case RS512:
66+
return false;
67+
default:
68+
logger.error("isSymmetric - not implemented algorithm");
69+
return false;
70+
}
71+
}
72+
}

gamutils/src/main/java/com/genexus/gam/utils/json/Jwt.java

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import com.genexus.gam.utils.keys.PrivateKeyUtil;
44
import com.genexus.gam.utils.keys.PublicKeyUtil;
5-
import com.nimbusds.jose.JWSAlgorithm;
6-
import com.nimbusds.jose.JWSHeader;
7-
import com.nimbusds.jose.JWSSigner;
8-
import com.nimbusds.jose.JWSVerifier;
5+
import com.nimbusds.jose.*;
96
import com.nimbusds.jose.crypto.MACSigner;
107
import com.nimbusds.jose.crypto.MACVerifier;
118
import com.nimbusds.jose.crypto.RSASSASigner;
@@ -17,27 +14,29 @@
1714

1815
import java.security.interfaces.RSAPrivateKey;
1916
import java.security.interfaces.RSAPublicKey;
17+
import java.text.ParseException;
18+
import java.util.Objects;
2019

2120
public class Jwt {
2221

2322
private static final Logger logger = LogManager.getLogger(Jwt.class);
2423

2524
/******** EXTERNAL OBJECT PUBLIC METHODS - BEGIN ********/
2625

27-
public static boolean verify(String path, String alias, String password, String token, String secret, boolean isSymmetric) {
26+
public static boolean verify(String path, String alias, String password, String token) {
2827
logger.debug("verify");
2928
try {
30-
return !isSymmetric ? verify_internal(PublicKeyUtil.getPublicKey(path, alias, password, token), token, "", isSymmetric) : verify_internal(null, token, secret, isSymmetric);
29+
return verify_internal(path, alias, password, token);
3130
} catch (Exception e) {
3231
logger.error("verify", e);
3332
return false;
3433
}
3534
}
3635

37-
public static String create(String path, String alias, String password, String payload, String header, String secret, boolean isSymmetric) {
36+
public static String create(String path, String alias, String password, String payload, String header) {
3837
logger.debug("create");
3938
try {
40-
return !isSymmetric ? create_internal(PrivateKeyUtil.getPrivateKey(path, alias, password), payload, header, "", isSymmetric): create_internal(null, payload, header, secret, isSymmetric);
39+
return create_internal(path, alias, password, payload, header);
4140
}catch (Exception e)
4241
{
4342
logger.error("create", e);
@@ -79,29 +78,25 @@ public static boolean verifyAlgorithm(String algorithm, String token)
7978

8079
/******** EXTERNAL OBJECT PUBLIC METHODS - END ********/
8180

82-
private static boolean verify_internal(RSAPublicKey publicKey, String token, String secret, boolean isSymmetric){
81+
private static boolean verify_internal(String path, String alias, String password, String token) throws JOSEException, ParseException {
8382
logger.debug("verify_internal");
84-
try {
85-
SignedJWT signedJWT = SignedJWT.parse(token);
86-
JWSVerifier verifier = isSymmetric ? new MACVerifier(secret):new RSASSAVerifier(publicKey);
87-
return signedJWT.verify(verifier);
88-
} catch (Exception e) {
89-
logger.error("verify_internal", e);
90-
return false;
91-
}
83+
JWTAlgorithm algorithm = JWTAlgorithm.getJWTAlgoritm(JWSHeader.parse(getHeader(token)).getAlgorithm().getName());
84+
assert algorithm != null;
85+
boolean isSymmetric = JWTAlgorithm.isSymmetric(algorithm);
86+
SignedJWT signedJWT = SignedJWT.parse(token);
87+
JWSVerifier verifier = isSymmetric ? new MACVerifier(password):new RSASSAVerifier(Objects.requireNonNull(PublicKeyUtil.getPublicKey(path, alias, password, token)));
88+
return signedJWT.verify(verifier);
9289
}
9390

94-
private static String create_internal(RSAPrivateKey privateKey, String payload, String header, String secret, boolean isSymmetric) {
91+
private static String create_internal(String path, String alias, String password, String payload, String header) throws Exception {
9592
logger.debug("create_internal");
96-
try {
97-
SignedJWT signedJWT = new SignedJWT(JWSHeader.parse(header), JWTClaimsSet.parse(payload));
98-
JWSSigner signer = isSymmetric ? new MACSigner(secret): new RSASSASigner(privateKey);
99-
signedJWT.sign(signer);
100-
return signedJWT.serialize();
101-
} catch (Exception e) {
102-
logger.error("create_internal", e);
103-
return "";
104-
}
93+
JWSHeader parsedHeader = JWSHeader.parse(header);
94+
JWTAlgorithm algorithm = JWTAlgorithm.getJWTAlgoritm(parsedHeader.getAlgorithm().getName());
95+
assert algorithm != null;
96+
boolean isSymmetric = JWTAlgorithm.isSymmetric(algorithm);
97+
SignedJWT signedJWT = new SignedJWT(parsedHeader, JWTClaimsSet.parse(payload));
98+
JWSSigner signer = isSymmetric ? new MACSigner(password): new RSASSASigner(Objects.requireNonNull(PrivateKeyUtil.getPrivateKey(path, alias, password)));
99+
signedJWT.sign(signer);
100+
return signedJWT.serialize();
105101
}
106-
107102
}

gamutils/src/test/java/com/genexus/gam/utils/test/EncodingTest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ private static String b64UrlToUtf8(String base64Url) {
3434
}
3535
}
3636

37+
@Test
38+
public void testToBase64Url() {
39+
int i = 0;
40+
do {
41+
String randomString = GamUtilsEO.randomAlphanumeric(128);
42+
String testing = GamUtilsEO.toBase64Url(randomString);
43+
Assert.assertEquals("testB64ToB64Url", randomString, GamUtilsEO.fromBase64Url(testing));
44+
i++;
45+
} while (i < 50);
46+
}
47+
3748
@Test
3849
public void testHexaToBase64()
3950
{
@@ -57,5 +68,4 @@ private static String b64ToHexa(String base64) {
5768
}
5869

5970

60-
6171
}

0 commit comments

Comments
 (0)