From 861beeba640511cbff2c5db22958491393808c96 Mon Sep 17 00:00:00 2001 From: Amanda Anganes <aanganes@mitre.org> Date: Wed, 24 Jul 2013 17:48:26 -0400 Subject: [PATCH] Added c_hash function, added stub of unit test for JWSUtils --- .../mitre/openid/connect/util/JWSUtils.java | 33 ++++++++++++++-- .../openid/connect/util/TestJWSUtils.java | 39 +++++++++++++++++++ 2 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 openid-connect-server/src/test/java/org/mitre/openid/connect/util/TestJWSUtils.java diff --git a/openid-connect-server/src/main/java/org/mitre/openid/connect/util/JWSUtils.java b/openid-connect-server/src/main/java/org/mitre/openid/connect/util/JWSUtils.java index 52f636f7d..f515db52c 100644 --- a/openid-connect-server/src/main/java/org/mitre/openid/connect/util/JWSUtils.java +++ b/openid-connect-server/src/main/java/org/mitre/openid/connect/util/JWSUtils.java @@ -7,6 +7,7 @@ import java.util.Arrays; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; +import org.mitre.oauth2.model.OAuth2AccessTokenEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,11 +24,36 @@ public class JWSUtils { private static Logger logger = LoggerFactory.getLogger(JWSUtils.class); - public static Base64URL getAccessTokenHash(JWSAlgorithm signingAlg, byte[] tokenBytes) { + /** + * Compute the HMAC hash of an authorization code + * + * @param signingAlg + * @param code + * @return + */ + public static Base64URL getCodeHash(JWSAlgorithm signingAlg, String code) { + return getHash(signingAlg, code.getBytes()); + } + + /** + * Compute the HMAC hash of a token + * + * @param signingAlg + * @param token + * @return + */ + public static Base64URL getAccessTokenHash(JWSAlgorithm signingAlg, OAuth2AccessTokenEntity token) { + + byte[] tokenBytes = token.getJwt().serialize().getBytes(); + + return getHash(signingAlg, tokenBytes); + + } + + public static Base64URL getHash(JWSAlgorithm signingAlg, byte[] bytes) { //Switch based on the given signing algorithm - use HMAC with the same bitnumber //as the JWSAlgorithm to hash the token. - String hashAlg = null; if (signingAlg.equals(JWSAlgorithm.HS256) || signingAlg.equals(JWSAlgorithm.ES256) || signingAlg.equals(JWSAlgorithm.RS256)) { @@ -46,7 +72,7 @@ public class JWSUtils { try { Mac mac = Mac.getInstance(hashAlg); - mac.init(new SecretKeySpec(tokenBytes, hashAlg)); + mac.init(new SecretKeySpec(bytes, hashAlg)); byte[] at_hash_bytes = mac.doFinal(); byte[] at_hash_bytes_left = Arrays.copyOf(at_hash_bytes, at_hash_bytes.length / 2); @@ -66,7 +92,6 @@ public class JWSUtils { } return null; - } } diff --git a/openid-connect-server/src/test/java/org/mitre/openid/connect/util/TestJWSUtils.java b/openid-connect-server/src/test/java/org/mitre/openid/connect/util/TestJWSUtils.java new file mode 100644 index 000000000..fe2fc1bc4 --- /dev/null +++ b/openid-connect-server/src/test/java/org/mitre/openid/connect/util/TestJWSUtils.java @@ -0,0 +1,39 @@ +package org.mitre.openid.connect.util; + + +import net.minidev.json.JSONObject; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +import com.nimbusds.jose.JWSAlgorithm; +import com.nimbusds.jose.util.Base64URL; +import com.nimbusds.jwt.JWTClaimsSet; + +@RunWith(MockitoJUnitRunner.class) +public class TestJWSUtils { + + @Before + public void prepare() { + + } + + @Test + public void compute_hs256_at_hash() { + JWTClaimsSet jwt = new JWTClaimsSet(); + jwt.setType("JWT"); + jwt.setClaim("alg", "HS256"); + JSONObject jwtObj = jwt.toJSONObject(); + String jwtString = jwtObj.toJSONString(); + byte[] jwtBytes = jwtString.getBytes(); + + Base64URL signedJwt = JWSUtils.getHash(JWSAlgorithm.HS256, jwtBytes); + + + } + + + +}