package com.nimbusds.jose; import java.text.ParseException; import java.util.List; import junit.framework.TestCase; import com.nimbusds.jose.util.Base64URL; /** * Tests JSON Web Key (JWK) set parsing and serialisation. * * @author Vladimir Dzhuvinov * @version $version$ (2012-11-29) */ public class JWKSetTest extends TestCase { public void testParse() { // The string is from the JWK spec String s = "{\"keys\":" + "[" + "{\"alg\":\"EC\"," + "\"crv\":\"P-256\"," + "\"x\":\"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4\"," + "\"y\":\"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM\"," + "\"use\":\"enc\"," + "\"kid\":\"1\"}," + " " + "{\"alg\":\"RSA\"," + "\"n\": \"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx" + "4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMs" + "tn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2" + "QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbI" + "SD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqb" + "w0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw\"," + "\"e\":\"AQAB\"," + "\"kid\":\"2011-04-29\"}" + "]" + "}"; JWKSet keySet = null; try { keySet = JWKSet.parse(s); } catch (ParseException e) { fail(e.getMessage()); } List<JWK> keyList = keySet.getKeys(); assertNotNull(keyList); assertEquals(2, keyList.size()); JWK key = keyList.get(0); assertNotNull(key); assertTrue(key instanceof ECKey); assertEquals("1", key.getKeyID()); assertEquals(Use.ENCRYPTION, key.getKeyUse()); ECKey ecKey = (ECKey)key; assertEquals(ECKey.Curve.P_256, ecKey.getCurve()); assertEquals("MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4", ecKey.getX().toString()); assertEquals("4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM", ecKey.getY().toString()); key = keyList.get(1); assertNotNull(key); assertTrue(key instanceof RSAKey); assertEquals("2011-04-29", key.getKeyID()); assertNull(key.getKeyUse()); RSAKey rsaKey = (RSAKey)key; assertEquals("0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx" + "4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMs" + "tn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2" + "QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbI" + "SD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqb" + "w0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw", rsaKey.getModulus().toString()); assertEquals("AQAB", rsaKey.getExponent().toString()); } public void testSerializeAndParse() { ECKey ecKey = new ECKey(ECKey.Curve.P_256, new Base64URL("abc"), new Base64URL("def"), Use.ENCRYPTION, "1234"); RSAKey rsaKey = new RSAKey(new Base64URL("abc"), new Base64URL("def"), Use.SIGNATURE, "5678"); JWKSet keySet = new JWKSet(); keySet.getKeys().add(ecKey); keySet.getKeys().add(rsaKey); assertEquals(0, keySet.getAdditionalMembers().size()); keySet.getAdditionalMembers().put("setID", "xyz123"); assertEquals(1, keySet.getAdditionalMembers().size()); String s = keySet.toString(); try { keySet = JWKSet.parse(s); } catch (ParseException e) { fail(e.getMessage()); } assertNotNull(keySet); assertEquals(2, keySet.getKeys().size()); ecKey = (ECKey)keySet.getKeys().get(0); assertNotNull(ecKey); assertEquals(ECKey.Curve.P_256, ecKey.getCurve()); assertEquals("abc", ecKey.getX().toString()); assertEquals("def", ecKey.getY().toString()); assertEquals(Use.ENCRYPTION, ecKey.getKeyUse()); assertEquals("1234", ecKey.getKeyID()); rsaKey = (RSAKey)keySet.getKeys().get(1); assertNotNull(rsaKey); assertEquals("abc", rsaKey.getModulus().toString()); assertEquals("def", rsaKey.getExponent().toString()); assertEquals(Use.SIGNATURE, rsaKey.getKeyUse()); assertEquals("5678", rsaKey.getKeyID()); assertEquals(1, keySet.getAdditionalMembers().size()); assertEquals("xyz123", (String)keySet.getAdditionalMembers().get("setID")); } }