package com.nimbusds.jose.crypto;
import junit.framework.TestCase;
import com.nimbusds.jose.JOSEObjectType;
import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.JWSHeader;
import com.nimbusds.jose.JWSObject;
import com.nimbusds.jose.JWSSigner;
import com.nimbusds.jose.JWSVerifier;
import com.nimbusds.jose.Payload;
import com.nimbusds.jose.util.Base64URL;
/**
* Tests HS256 JWS signing and verfication. Uses test vectors from JWS spec.
*
* @author Vladimir Dzhuvinov
* @version $version$ (2012-10-23)
*/
public class MACTest extends TestCase {
private static final byte[] sharedSecret =
{ (byte) 3, (byte) 35, (byte) 53, (byte) 75, (byte) 43, (byte) 15, (byte) 165, (byte) 188,
(byte) 131, (byte) 126, (byte) 6, (byte) 101, (byte) 119, (byte) 123, (byte) 166, (byte) 143,
(byte) 90, (byte) 179, (byte) 40, (byte) 230, (byte) 240, (byte) 84, (byte) 201, (byte) 40,
(byte) 169, (byte) 15, (byte) 132, (byte) 178, (byte) 210, (byte) 80, (byte) 46, (byte) 191,
(byte) 211, (byte) 251, (byte) 90, (byte) 146, (byte) 210, (byte) 6, (byte) 71, (byte) 239,
(byte) 150, (byte) 138, (byte) 180, (byte) 195, (byte) 119, (byte) 98, (byte) 61, (byte) 34,
(byte) 61, (byte) 46, (byte) 33, (byte) 114, (byte) 5, (byte) 46, (byte) 79, (byte) 8,
(byte) 192, (byte) 205, (byte) 154, (byte) 245, (byte) 103, (byte) 208, (byte) 128, (byte) 163 };
private static final Base64URL b64header = new Base64URL("eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9");
private static final Payload payload = new Payload(new Base64URL("eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt" +
"cGxlLmNvbS9pc19yb290Ijp0cnVlfQ"));
private static final byte[] signable = new String("eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9" +
"." +
"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt" +
"cGxlLmNvbS9pc19yb290Ijp0cnVlfQ").getBytes();
private static final Base64URL b64sig = new Base64URL("dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk");
public void testSignAndVerify()
throws Exception {
JWSHeader header = JWSHeader.parse(b64header);
assertEquals("HS256 alg check", JWSAlgorithm.HS256, header.getAlgorithm());
assertEquals("JWT type check", new JOSEObjectType("JWT"), header.getType());
JWSObject jwsObject = new JWSObject(header, payload);
assertEquals("State check", JWSObject.State.UNSIGNED, jwsObject.getState());
MACSigner signer = new MACSigner(sharedSecret);
assertEquals("Shared secret check", sharedSecret, signer.getSharedSecret());
assertEquals(3, signer.supportedAlgorithms().size());
assertTrue(signer.supportedAlgorithms().contains(JWSAlgorithm.HS256));
assertTrue(signer.supportedAlgorithms().contains(JWSAlgorithm.HS384));
assertTrue(signer.supportedAlgorithms().contains(JWSAlgorithm.HS512));
jwsObject.sign(signer);
assertEquals("State check", JWSObject.State.SIGNED, jwsObject.getState());
MACVerifier verifier = new MACVerifier(sharedSecret);
assertEquals("Shared secret check", sharedSecret, verifier.getSharedSecret());
assertEquals(3, signer.supportedAlgorithms().size());
assertTrue(signer.supportedAlgorithms().contains(JWSAlgorithm.HS256));
assertTrue(signer.supportedAlgorithms().contains(JWSAlgorithm.HS384));
assertTrue(signer.supportedAlgorithms().contains(JWSAlgorithm.HS512));
boolean verified = jwsObject.verify(verifier);
assertTrue("Verified signature", verified);
assertEquals("State check", JWSObject.State.VERIFIED, jwsObject.getState());
}
public void testSignWithReadyVector()
throws Exception {
JWSHeader header = JWSHeader.parse(b64header);
JWSSigner signer = new MACSigner(sharedSecret);
Base64URL b64sigComputed = signer.sign(header, signable);
assertEquals("Signature check", b64sig, b64sigComputed);
}
public void testVerifyWithReadyVector()
throws Exception {
JWSHeader header = JWSHeader.parse(b64header);
JWSVerifier verifier = new MACVerifier(sharedSecret);
boolean verified = verifier.verify(header, signable, b64sig);
assertTrue("Signature check", verified);
}
public void testParseAndVerify()
throws Exception {
String s = b64header.toString() + "." + payload.toBase64URL().toString() + "." + b64sig.toString();
JWSObject jwsObject = JWSObject.parse(s);
assertEquals(s, jwsObject.getParsedString());
assertEquals("State check", JWSObject.State.SIGNED, jwsObject.getState());
JWSVerifier verifier = new MACVerifier(sharedSecret);
boolean verified = jwsObject.verify(verifier);
assertTrue("Signature check", verified);
assertEquals("State check", JWSObject.State.VERIFIED, jwsObject.getState());
}
}