diff --git a/src/main/java/org/sasanlabs/service/vulnerability/jwt/bean/JWTUtils.java b/src/main/java/org/sasanlabs/service/vulnerability/jwt/bean/JWTUtils.java
index cee663c6..ca1c3611 100755
--- a/src/main/java/org/sasanlabs/service/vulnerability/jwt/bean/JWTUtils.java
+++ b/src/main/java/org/sasanlabs/service/vulnerability/jwt/bean/JWTUtils.java
@@ -18,8 +18,13 @@
import org.sasanlabs.service.exception.ExceptionStatusCodeEnum;
import org.sasanlabs.service.exception.ServiceApplicationException;
-/** @author KSASAN preetkaran20@gmail.com */
-public class JWTUtils {
+/** Utility class for JWT operations. */
+public final class JWTUtils {
+
+ // Utility class → private constructor to prevent instantiation
+ private JWTUtils() {
+ throw new IllegalStateException("Utility class");
+ }
public static final char JWT_TOKEN_PERIOD_CHARACTER = '.';
@@ -37,7 +42,7 @@ public class JWTUtils {
public static final String JWT_EC_ALGORITHM_IDENTIFIER = "EC";
public static final String JWT_OCTET_ALGORITHM_IDENTIFIER = "ED";
public static final String JWT_HMAC_SHA_256_ALGORITHM = "HS256";
- // TODO need to make it better.
+
public static final String HS256_TOKEN_TO_BE_SIGNED =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9."
+ "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ";
@@ -50,17 +55,10 @@ public class JWTUtils {
"eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG"
+ "4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0";
+ // Location of keys
public static final String KEYS_LOCATION = "static/templates/JWTVulnerability/keys/";
- /**
- * This is the Begining and Ending token of Public and Private Keys encoded with PKCS#8
- * encoding. In case you find PEM file not having these tokens and instead have -----BEGIN RSA
- * PRIVATE KEY----- or -----BEGIN RSA PUBLIC KEY----- then those are encoded by old format. To
- * Generate new Keys please use following link
- */
public static final String BEGIN_PRIVATE_KEY_TOKEN = "-----BEGIN PRIVATE KEY-----";
-
public static final String END_PRIVATE_KEY_TOKEN = "-----END PRIVATE KEY-----";
public static final String BEGIN_PUBLIC_KEY_TOKEN = "-----BEGIN PUBLIC KEY-----";
public static final String END_PUBLIC_KEY_TOKEN = "-----END PUBLIC KEY-----";
@@ -76,54 +74,25 @@ public static String getString(byte[] tokenBytes) throws UnsupportedEncodingExce
public static final Map JWT_HMAC_ALGO_TO_JAVA_ALGORITHM_MAPPING =
createJWTHmacAlgoToJavaAlgoMapping();
- static Map createJWTHmacAlgoToJavaAlgoMapping() {
- Map jwtAlgoToJavaAlgoMapping = new HashMap();
+ private static Map createJWTHmacAlgoToJavaAlgoMapping() {
+ Map jwtAlgoToJavaAlgoMapping = new HashMap<>();
jwtAlgoToJavaAlgoMapping.put(JWT_HMAC_SHA_256_ALGORITHM, "HmacSHA256");
jwtAlgoToJavaAlgoMapping.put("HS384", "HmacSHA384");
jwtAlgoToJavaAlgoMapping.put("HS512", "HmacSHA512");
return jwtAlgoToJavaAlgoMapping;
}
- /**
- * we are using base64 Url Safe
- * encoding. because of JWT specifications
- * Also we are removing the padding as per RFC 7515 padding is not there in JWT.
- *
- * @param token
- * @return
- * @throws UnsupportedEncodingException
- */
public static String getBase64UrlSafeWithoutPaddingEncodedString(String token)
throws UnsupportedEncodingException {
- return JWTUtils.getBase64UrlSafeWithoutPaddingEncodedString(getBytes(token));
+ return getBase64UrlSafeWithoutPaddingEncodedString(getBytes(token));
}
- /**
- * we are using base64 Url Safe
- * encoding. because of JWT specifications
- * Also we are removing the padding as per RFC 7515 padding is not there in JWT.
- *
- * @param token
- * @return
- * @throws UnsupportedEncodingException
- */
public static String getBase64UrlSafeWithoutPaddingEncodedString(byte[] token)
throws UnsupportedEncodingException {
- return JWTUtils.getString(Base64.getUrlEncoder().encode(token))
+ return getString(Base64.getUrlEncoder().encode(token))
.replaceAll(BASE64_PADDING_CHARACTER_REGEX, "");
}
- /**
- * Utility method for reading the PEM file and building RSAPrivateKey from it. Note: This method
- * assumes that PEM file contains PKCS#8 encoded Key format please check the format.
- *
- * @param pemFile InputStream of PEM file containing RSA Private Key
- * @return RSAPrivateKey by reading PEM file containing the RSA Private Key.
- * @throws JWTException if unable to read the provided file path or key specification is
- * incorrect etc.
- */
public static RSAPrivateKey getRSAPrivateKeyFromProvidedPEMFilePath(InputStream pemFile)
throws ServiceApplicationException {
try {
@@ -138,15 +107,6 @@ public static RSAPrivateKey getRSAPrivateKeyFromProvidedPEMFilePath(InputStream
}
}
- /**
- * Utility method for reading the PEM file and building RSAPublicKey from it. Note: This method
- * assumes that PEM file contains PKCS#8 encoded Key format please check the format.
- *
- * @param pemFile InputStream of PEM file containing RSA Public Key.
- * @return RSAPublicKey by reading PEM file containing the RSA Private Key.
- * @throws JWTException if unable to read the provided file path or key specification is
- * incorrect etc.
- */
public static RSAPublicKey getRSAPublicKeyFromProvidedPEMFilePath(InputStream pemFile)
throws ServiceApplicationException {
try {
@@ -161,33 +121,11 @@ public static RSAPublicKey getRSAPublicKeyFromProvidedPEMFilePath(InputStream pe
}
}
- /**
- * Checks if the provided tokens i.e. {@param beginToken} or {@param endToken} are present in
- * the provided {@param contents}.
- *
- * @param contents
- * @param beginToken
- * @param endToken
- * @return true if provided token params are present in contents else false.
- */
private static boolean containsSection(String contents, String beginToken, String endToken) {
- int idxToken;
- if ((idxToken = contents.indexOf(beginToken)) == -1
- || contents.indexOf(endToken) < idxToken) {
- return false;
- }
- return true;
+ int idxToken = contents.indexOf(beginToken);
+ return idxToken != -1 && contents.indexOf(endToken) > idxToken;
}
- /**
- * Converts PEM to DER format i.e. removes the Begin and End tokens and decode the base64
- * encoded certificate.
- *
- * @param pem
- * @param beginDelimiter
- * @param endDelimiter
- * @return DER format Key
- */
private static byte[] parseDERFromPEM(String pem, String beginDelimiter, String endDelimiter) {
if (!containsSection(pem, beginDelimiter, endDelimiter)) {
return new byte[0];