Skip to content

Commit 92fcf83

Browse files
sgramponeBeta Bot
authored andcommitted
Cherry pick branch 'genexuslabs:gamutils_eo' into beta
1 parent 4bf592a commit 92fcf83

File tree

9 files changed

+251
-39
lines changed

9 files changed

+251
-39
lines changed

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

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ public static String randomHexaBits(int bits) {
4242
return Random.hexaBits(bits);
4343
}
4444

45+
public static String randomUtf8Bits(int bits) {
46+
return Random.utf8Bits(bits);
47+
}
48+
4549
//**JWK**//
4650

4751
public static String generateKeyPair() {
@@ -52,13 +56,30 @@ public static String getPublicJwk(String jwkString) {
5256
return Jwk.getPublic(jwkString);
5357
}
5458

59+
public static String getJwkAlgorithm(String jwkString) {
60+
return Jwk.getAlgorithm(jwkString);
61+
}
62+
5563
//**JWT**//
56-
public static boolean verifyJwt(String path, String alias, String password, String token) {
57-
return Jwt.verify(path, alias, password, token);
64+
public static boolean verifyJwtRsa(String path, String alias, String password, String token) {
65+
return Jwt.verify(path, alias, password, token, "", false);
66+
}
67+
68+
public static String createJwtRsa(String path, String alias, String password, String payload, String header) {
69+
return Jwt.create(path, alias, password, payload, header, "", false);
5870
}
5971

60-
public static String createJwt(String path, String alias, String password, String payload, String header) {
61-
return Jwt.create(path, alias, password, payload, header);
72+
public static boolean verifyJwtSha(String secret, String token) {
73+
return Jwt.verify("", "", "", token, secret, true);
74+
}
75+
76+
public static boolean verifyAlgorithm(String expectedAlgorithm, String token)
77+
{
78+
return Jwt.verifyAlgorithm(expectedAlgorithm, token);
79+
}
80+
81+
public static String createJwtSha(String secret, String payload, String header) {
82+
return Jwt.create("", "", "", payload, header, secret, true);
6283
}
6384

6485
public static long createUnixTimestamp(Date date) {
@@ -78,5 +99,7 @@ public static String base64ToBase64Url(String base64) {
7899
return Encoding.b64ToB64Url(base64);
79100
}
80101

102+
public static String hexaToBase64(String hexa) { return Encoding.hexaToBase64(hexa); }
103+
81104
/********EXTERNAL OBJECT PUBLIC METHODS - END ********/
82105
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.apache.logging.log4j.LogManager;
55
import org.apache.logging.log4j.Logger;
66
import org.bouncycastle.util.encoders.Base64;
7+
import org.bouncycastle.util.encoders.Hex;
78
import org.bouncycastle.util.encoders.UrlBase64;
89

910
public class Encoding {
@@ -19,4 +20,16 @@ public static String b64ToB64Url(String input) {
1920
return "";
2021
}
2122
}
23+
24+
public static String hexaToBase64(String hexa)
25+
{
26+
logger.debug("hexaToBase64");
27+
try{
28+
return Base64.toBase64String(Hex.decode(hexa));
29+
}catch (Exception e)
30+
{
31+
logger.error("hexaToBase64", e);
32+
return "";
33+
}
34+
}
2235
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.apache.logging.log4j.LogManager;
44
import org.apache.logging.log4j.Logger;
55

6+
import java.nio.charset.StandardCharsets;
67
import java.security.SecureRandom;
78

89
public class Random {
@@ -59,4 +60,25 @@ public static String hexaBits(int bits)
5960
}
6061
return sb.toString().replaceAll("\\s", "");
6162
}
63+
64+
public static String utf8Bits(int bits)
65+
{
66+
int targetBytes = (bits + 7) / 8;
67+
StringBuilder sb = new StringBuilder();
68+
for (int i = 0; i < targetBytes; i++) {
69+
sb.append("a");
70+
}
71+
String result = sb.toString();
72+
byte[] utf8Bytes = sb.toString().getBytes(StandardCharsets.UTF_8);
73+
if (utf8Bytes.length > targetBytes) {
74+
return new String(utf8Bytes, 0, targetBytes, StandardCharsets.UTF_8);
75+
} else if (utf8Bytes.length < targetBytes) {
76+
StringBuilder paddedString = new StringBuilder(sb.toString());
77+
for (int i = utf8Bytes.length; i < targetBytes; i++) {
78+
paddedString.append("0");
79+
}
80+
return paddedString.toString();
81+
}
82+
return result;
83+
}
6284
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,20 @@ public static String getPublic(String jwkString) {
4444
}
4545
}
4646

47+
public static String getAlgorithm(String jwkString) {
48+
if (jwkString.isEmpty()) {
49+
logger.error("getAlgorithm jwkString parameter is empty");
50+
return "";
51+
}
52+
try {
53+
return JWK.parse(jwkString).getAlgorithm().toString();
54+
} catch (Exception e) {
55+
logger.error("getPublic", e);
56+
return "";
57+
}
58+
}
59+
60+
4761
/*public static boolean verifyJWT(String jwkString, String token) {
4862
if (jwkString.isEmpty()) {
4963
logger.error("verifyJWT jwkString parameter is empty");

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

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22

33
import com.genexus.gam.utils.keys.PrivateKeyUtil;
44
import com.genexus.gam.utils.keys.PublicKeyUtil;
5+
import com.nimbusds.jose.JWSAlgorithm;
56
import com.nimbusds.jose.JWSHeader;
7+
import com.nimbusds.jose.JWSSigner;
68
import com.nimbusds.jose.JWSVerifier;
9+
import com.nimbusds.jose.crypto.MACSigner;
10+
import com.nimbusds.jose.crypto.MACVerifier;
711
import com.nimbusds.jose.crypto.RSASSASigner;
812
import com.nimbusds.jose.crypto.RSASSAVerifier;
913
import com.nimbusds.jwt.JWTClaimsSet;
@@ -20,20 +24,20 @@ public class Jwt {
2024

2125
/******** EXTERNAL OBJECT PUBLIC METHODS - BEGIN ********/
2226

23-
public static boolean verify(String path, String alias, String password, String token) {
27+
public static boolean verify(String path, String alias, String password, String token, String secret, boolean isSymmetric) {
2428
logger.debug("verify");
2529
try {
26-
return verify(PublicKeyUtil.getPublicKey(path, alias, password, token), token);
30+
return !isSymmetric ? verify_internal(PublicKeyUtil.getPublicKey(path, alias, password, token), token, "", isSymmetric) : verify_internal(null, token, secret, isSymmetric);
2731
} catch (Exception e) {
2832
logger.error("verify", e);
2933
return false;
3034
}
3135
}
3236

33-
public static String create(String path, String alias, String password, String payload, String header) {
37+
public static String create(String path, String alias, String password, String payload, String header, String secret, boolean isSymmetric) {
3438
logger.debug("create");
3539
try {
36-
return create(PrivateKeyUtil.getPrivateKey(path, alias, password), payload, header);
40+
return !isSymmetric ? create_internal(PrivateKeyUtil.getPrivateKey(path, alias, password), payload, header, "", isSymmetric): create_internal(null, payload, header, secret, isSymmetric);
3741
}catch (Exception e)
3842
{
3943
logger.error("create", e);
@@ -61,26 +65,41 @@ public static String getPayload(String token) {
6165
}
6266
}
6367

68+
public static boolean verifyAlgorithm(String algorithm, String token)
69+
{
70+
logger.debug("verifyAlgorithm");
71+
try{
72+
return SignedJWT.parse(token).getHeader().getAlgorithm().equals(JWSAlgorithm.parse(algorithm));
73+
}catch (Exception e)
74+
{
75+
logger.error("verifyAlgorithm", e);
76+
return false;
77+
}
78+
}
79+
6480
/******** EXTERNAL OBJECT PUBLIC METHODS - END ********/
6581

66-
private static boolean verify(RSAPublicKey publicKey, String token) {
82+
private static boolean verify_internal(RSAPublicKey publicKey, String token, String secret, boolean isSymmetric){
83+
logger.debug("verify_internal");
6784
try {
6885
SignedJWT signedJWT = SignedJWT.parse(token);
69-
JWSVerifier verifier = new RSASSAVerifier(publicKey);
86+
JWSVerifier verifier = isSymmetric ? new MACVerifier(secret):new RSASSAVerifier(publicKey);
7087
return signedJWT.verify(verifier);
7188
} catch (Exception e) {
72-
logger.error("verify", e);
89+
logger.error("verify_internal", e);
7390
return false;
7491
}
7592
}
7693

77-
private static String create(RSAPrivateKey privateKey, String payload, String header) {
94+
private static String create_internal(RSAPrivateKey privateKey, String payload, String header, String secret, boolean isSymmetric) {
95+
logger.debug("create_internal");
7896
try {
7997
SignedJWT signedJWT = new SignedJWT(JWSHeader.parse(header), JWTClaimsSet.parse(payload));
80-
signedJWT.sign(new RSASSASigner(privateKey));
98+
JWSSigner signer = isSymmetric ? new MACSigner(secret): new RSASSASigner(privateKey);
99+
signedJWT.sign(signer);
81100
return signedJWT.serialize();
82101
} catch (Exception e) {
83-
logger.error("create", e);
102+
logger.error("create_internal", e);
84103
return "";
85104
}
86105
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.genexus.gam.utils.test;
22

33
import com.genexus.gam.GamUtilsEO;
4+
import com.genexus.gam.utils.Encoding;
5+
import com.genexus.gam.utils.Random;
46
import org.bouncycastle.util.encoders.Base64;
7+
import org.bouncycastle.util.encoders.Hex;
58
import org.bouncycastle.util.encoders.UrlBase64;
69
import org.junit.Assert;
710
import org.junit.Test;
@@ -31,5 +34,28 @@ private static String b64UrlToUtf8(String base64Url) {
3134
}
3235
}
3336

37+
@Test
38+
public void testHexaToBase64()
39+
{
40+
int i = 0;
41+
do {
42+
String randomHexa = Random.hexaBits(128);
43+
String testing = b64ToHexa(Encoding.hexaToBase64(randomHexa));
44+
Assert.assertEquals("testB64ToB64Url", randomHexa, testing);
45+
i++;
46+
} while (i < 50);
47+
}
48+
49+
private static String b64ToHexa(String base64) {
50+
try {
51+
byte[] bytes = Base64.decode(base64);
52+
return Hex.toHexString(bytes);
53+
} catch (Exception e) {
54+
e.printStackTrace();
55+
return "";
56+
}
57+
}
58+
59+
3460

3561
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,12 @@ public void testPublicJwk() {
2727
Assert.fail("Exception on testPublicJwk" + e.getMessage());
2828
}
2929
}
30+
31+
@Test
32+
public void testGetAlgorithm()
33+
{
34+
String jwk = GamUtilsEO.generateKeyPair();
35+
String algorithm = GamUtilsEO.getJwkAlgorithm(jwk);
36+
Assert.assertEquals("testGetAlgorithm", algorithm, "RS256");
37+
}
3038
}

0 commit comments

Comments
 (0)