package io.cattle.platform.token.impl; import static org.junit.Assert.*; import io.cattle.platform.token.CertSet; import io.cattle.platform.token.TokenException; import java.io.IOException; import java.math.BigInteger; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.cert.Certificate; import java.security.interfaces.RSAPrivateKey; import java.security.spec.EncodedKeySpec; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.RSAPublicKeySpec; import java.util.Date; import java.util.Map; import org.junit.Before; import org.junit.Test; import com.nimbusds.jose.util.Base64; public class JwtTokenServiceImplTest { private static final String KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJ6/qHmPd2DhNFRL/F+t6vi8PLlNL+Pa8EI7r9a0ct4JKKgc7VVYb4Y3BlC1bfwmoUA3ISnZOZrH29G408E0Yy17PkBReWTTirSUatfYK1aEiRVQpdbxtAVtCp3QGL6t4x5c/RDcOXlkuM1pK8czNWxS5rVsFtFLttoH48/2xgVrAgMBAAECgYB8xXrvgFl95cOxdb+4nAOQ2LKJmidH2a74/9ymzlFyPpSb/ZB0gfu1682k5dS6WMpopGwGblueUfNuFO0qb7h6qba+yoM0wQtbZ4sRLRJSEhitto2iwRdoloAs6193hZpsWr+fr/ePvd7mH/ESYTLUpx5s4jgSg5+m4fB3nWuHUQJBAOM1ibIF9IrXr65MpGJK5kvyFshiJw7w+YStSCV4HvD+hbbZkfHt0qHl0Akam3kPXxpnBETtDzdkgHELFSWr8I8CQQCy3VLUrb1BtgdW8UeHO/BLJMvxQw3psGu/ctFFODEaNU7M3UJDtTlBwyzu4F1dgOb+DqgI84XYeSR+Jj4fUpNlAkA2JjVJ0zeDu4GoFaX7swQNx4V8fj/2xKGC6FVQcL9XCiHOAS5SLS7M3NtmwAubn3k37qNK1gCRYAdoaY7BqqerAkEAmYNLbC4RmSxZ8Ez1TyQqgNP8Ff2vGzrHv3EUG4y21/+YukvMa8BGfCK/leYLPA0+NB7wKX6ZCcovf/Xiq4974QJAUJo0snUbHz71UHTFunrJ/VAJZ536Igcb7ICIgUKKUX8rOJo9luQ5Ok5GwlT9bkwigOYN45rylf0Znn46CfT1zQ=="; JwtTokenServiceImpl impl; @Before public void setUp() { impl = new JwtTokenServiceImpl(); impl.setKeyProvider(new RSAKeyProvider() { KeyFactory kf; EncodedKeySpec spec = new PKCS8EncodedKeySpec(new Base64(KEY).decode()); @Override public RSAPrivateKeyHolder getPrivateKey() { try { kf = KeyFactory.getInstance("RSA"); return new RSAPrivateKeyHolder("abc", (RSAPrivateKey) kf.generatePrivate(spec)); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } catch (InvalidKeySpecException e) { throw new RuntimeException(e); } } @Override public Map<String, PublicKey> getPublicKeys() { return null; } @Override public PublicKey getDefaultPublicKey() { try { kf = KeyFactory.getInstance("RSA"); BigInteger modulus = new BigInteger( "111477103238322465633334802347196848276745427190035850232359047430738831490294428792865542779043266665451160648116725279287065632589519313377918207473210865843357067938152969267052295101676828476867765239574399207781254529735105609482031252978262212237371891597488765482508817144842927535892383110624969098603"); BigInteger exponent = new BigInteger("65537"); RSAPublicKeySpec publicKeySpec = new java.security.spec.RSAPublicKeySpec(modulus, exponent); return kf.generatePublic(publicKeySpec); } catch (Exception e) { throw new RuntimeException(e); } } @Override public CertSet generateCertificate(String subject, String... sans) throws Exception { return null; } @Override public Certificate getCACertificate() { return null; } @Override public byte[] toBytes(Certificate cert) throws IOException { return null; } }); } @Test public void testSignedToken() throws TokenException { Map<String, Object> payload = impl.getJsonPayload( impl.generateToken(null, new Date(1413936626719L), null, false), false); assertEquals(payload.get("exp"), null); assertEquals(payload.get("iat"), Long.valueOf(1413936626)); } @Test(expected = TokenException.class) public void testCheckExpiry() throws TokenException { String expiredToken = impl.generateToken(null, new Date(1413936626719L), new Date(1413936626719L), false); impl.getJsonPayload(expiredToken, false); } @Test public void testDecryptsEncryptedToken() throws TokenException { String newEncryptedToken = impl.generateToken(null, new Date(1413936626719L), new Date(1923109200000L), true); Map<String, Object> decrypted = impl.getJsonPayload(newEncryptedToken, true); assertEquals(decrypted.get("exp"), Long.valueOf(1923109200)); assertEquals(decrypted.get("iat"), Long.valueOf(1413936626)); } }