/*******************************************************************************
* Cloud Foundry
* Copyright (c) [2009-2016] Pivotal Software, Inc. All Rights Reserved.
*
* This product is licensed to you under the Apache License, Version 2.0 (the "License").
* You may not use this product except in compliance with the License.
*
* This product includes a number of subcomponents with
* separate copyright notices and license terms. Your use of these
* subcomponents is subject to the terms and conditions of the
* subcomponent's license, as noted in the LICENSE file.
*******************************************************************************/
package org.cloudfoundry.identity.uaa.oauth.token;
import org.cloudfoundry.identity.uaa.impl.config.LegacyTokenKey;
import org.cloudfoundry.identity.uaa.oauth.KeyInfo;
import org.cloudfoundry.identity.uaa.zone.IdentityZone;
import org.cloudfoundry.identity.uaa.zone.IdentityZoneConfiguration;
import org.cloudfoundry.identity.uaa.zone.IdentityZoneHolder;
import org.cloudfoundry.identity.uaa.zone.IdentityZoneProvisioning;
import org.cloudfoundry.identity.uaa.zone.TokenPolicy;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.security.oauth2.common.util.RandomValueStringGenerator;
import org.springframework.util.StringUtils;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
*
* @author Joel D'sa
*
*/
public class KeyInfoTests {
private RandomValueStringGenerator generator = new RandomValueStringGenerator();
@BeforeClass
public static void setupLegacyKey() {
LegacyTokenKey.setLegacySigningKey("testLegacyKey");
}
@Test
public void testSignedProviderSymmetricKeys() {
String keyId = generator.generate();
configureDefaultZoneKeys(Collections.singletonMap(keyId, "testkey"));
KeyInfo key = KeyInfo.getKey(keyId);
assertNotNull(key.getSigner());
assertNotNull(key.getVerifier());
byte[] signedValue = key.getSigner().sign("joel".getBytes());
key.getVerifier().verify("joel".getBytes(), signedValue);
}
@Test
public void testSignedProviderAsymmetricKeys() throws Exception {
String signingKey = "-----BEGIN RSA PRIVATE KEY-----\n" +
"MIICXAIBAAKBgQDErZsZY70QAa7WdDD6eOv3RLBA4I5J0zZOiXMzoFB5yh64q0sm\n" +
"ESNtV4payOYE5TnHxWjMo0y7gDsGjI1omAG6wgfyp63I9WcLX7FDLyee43fG5+b9\n" +
"roofosL+OzJSXESSulsT9Y1XxSFFM5RMu4Ie9uM4/izKLCsAKiggMhnAmQIDAQAB\n" +
"AoGAAs2OllALk7zSZxAE2qz6f+2krWgF3xt5fKkM0UGJpBKzWWJnkcVQwfArcpvG\n" +
"W2+A4U347mGtaEatkKxUH5d6/s37jfRI7++HFXcLf6QJPmuE3+FtB2mX0lVJoaJb\n" +
"RLh+tOtt4ZJRAt/u6RjUCVNpDnJB6NZ032bpL3DijfNkRuECQQDkJR+JJPUpQGoI\n" +
"voPqcLl0i1tLX93XE7nu1YuwdQ5SmRaS0IJMozoBLBfFNmCWlSHaQpBORc38+eGC\n" +
"J9xsOrBNAkEA3LD1JoNI+wPSo/o71TED7BoVdwCXLKPqm0TnTr2EybCUPLNoff8r\n" +
"Ngm51jXc8mNvUkBtYiPfMKzpdqqFBWXXfQJAQ7D0E2gAybWQAHouf7/kdrzmYI3Y\n" +
"L3lt4HxBzyBcGIvNk9AD6SNBEZn4j44byHIFMlIvqNmzTY0CqPCUyRP8vQJBALXm\n" +
"ANmygferKfXP7XsFwGbdBO4mBXRc0qURwNkMqiMXMMdrVGftZq9Oiua9VJRQUtPn\n" +
"mIC4cmCLVI5jc+qEC30CQE+eOXomzxNNPxVnIp5k5f+savOWBBu83J2IoT2znnGb\n" +
"wTKZHjWybPHsW2q8Z6Moz5dvE+XMd11c5NtIG2/L97I=\n" +
"-----END RSA PRIVATE KEY-----";
String keyId = generator.generate();
configureDefaultZoneKeys(Collections.singletonMap(keyId, signingKey));
KeyInfo key = KeyInfo.getKey(keyId);
assertNotNull(key.getSigner());
assertNotNull(key.getVerifier());
byte[] signedValue = key.getSigner().sign("joel".getBytes());
key.getVerifier().verify("joel".getBytes(), signedValue);
}
@Test
public void testActiveKeyFallsBackToLegacyKey() {
configureDefaultZoneKeys(Collections.emptyMap());
assertEquals(KeyInfo.getActiveKey().getKeyId(), LegacyTokenKey.LEGACY_TOKEN_KEY_ID);
assertEquals(KeyInfo.getActiveKey().getSigningKey(), "testLegacyKey");
}
private void configureDefaultZoneKeys(Map<String,String> keys) {
IdentityZoneHolder.clear();
IdentityZoneProvisioning provisioning = mock(IdentityZoneProvisioning.class);
IdentityZoneHolder.setProvisioning(provisioning);
IdentityZone zone = IdentityZone.getUaa();
IdentityZoneConfiguration config = new IdentityZoneConfiguration();
TokenPolicy tokenPolicy = new TokenPolicy();
tokenPolicy.setKeys(keys);
config.setTokenPolicy(tokenPolicy);
zone.setConfig(config);
when(provisioning.retrieve("uaa")).thenReturn(zone);
}
}