1 package com.atlassian.asap.core.keys.privatekey;
2
3 import com.atlassian.asap.api.exception.CannotRetrieveKeyException;
4 import com.atlassian.asap.core.keys.DataUriKeyReader;
5 import com.atlassian.asap.core.keys.KeyProvider;
6 import com.atlassian.asap.core.validator.ValidatedKeyId;
7 import org.junit.Rule;
8 import org.junit.Test;
9 import org.junit.contrib.java.lang.system.ProvideSystemProperty;
10 import org.junit.rules.ExpectedException;
11 import org.mockito.Mock;
12 import org.mockito.junit.MockitoJUnit;
13 import org.mockito.junit.MockitoRule;
14
15 import java.io.InputStreamReader;
16 import java.net.URI;
17 import java.security.PrivateKey;
18 import java.security.interfaces.RSAPrivateKey;
19
20 import static org.hamcrest.Matchers.containsString;
21 import static org.hamcrest.Matchers.not;
22 import static org.junit.Assert.assertSame;
23 import static org.mockito.Matchers.any;
24 import static org.mockito.Mockito.when;
25
26 public class SystemPropertyKeyProviderTest {
27 private static final String VALID_KID = "issuer/kid";
28 private static final String PROPERTY_NAME_1 = "property.name.1";
29 private static final String PROPERTY_NAME_2 = "property.name.2";
30 private static final URI VALID_URL = URI.create("sysprop:///" + PROPERTY_NAME_1);
31 private static final URI INVALID_URL = URI.create("sysprop:///" + PROPERTY_NAME_2);
32 private static final String VALID_KEY_DATA = "data:application/pkcs8;kid=issuer%2Fkid;base64,EncodedKeyData";
33 private static final String UNPARSEABLE_PRIVATE_KEY_DATA = "unparseable private key data uri";
34
35 @Rule
36 public final MockitoRule mockitoRule = MockitoJUnit.rule();
37
38 @Rule
39 public final ProvideSystemProperty provideSystemProperty1 =
40 new ProvideSystemProperty(PROPERTY_NAME_1, VALID_KEY_DATA);
41
42 @Rule
43 public final ProvideSystemProperty provideSystemProperty2 =
44 new ProvideSystemProperty(PROPERTY_NAME_2, UNPARSEABLE_PRIVATE_KEY_DATA);
45
46 @Rule
47 public final ExpectedException expectedException = ExpectedException.none();
48
49 @Mock
50 private DataUriKeyReader keyReader;
51 @Mock
52 private RSAPrivateKey privateKey;
53
54 @Test
55 public void shouldBeAbleToReadKeyFromSystemProperty() throws Exception {
56 when(keyReader.readPrivateKey(any(InputStreamReader.class))).thenReturn(privateKey);
57
58 KeyProvider<PrivateKey> keyProvider = SystemPropertyKeyProvider.fromUri(VALID_URL, keyReader);
59
60 assertSame(privateKey, keyProvider.getKey(ValidatedKeyId.validate(VALID_KID)));
61 }
62
63 @Test
64 public void shouldFailWhenKeyIsNotAUri() throws Exception {
65 expectedException.expect(IllegalArgumentException.class);
66 expectedException.expectMessage(not(containsString("private key")));
67
68 KeyProvider<PrivateKey> keyProvider = SystemPropertyKeyProvider.fromUri(INVALID_URL, keyReader);
69 keyProvider.getKey(ValidatedKeyId.validate(VALID_KID));
70 }
71
72 @Test
73 public void shouldFailWhenKeyParserFails() throws Exception {
74 when(keyReader.readPrivateKey(any(InputStreamReader.class)))
75 .thenThrow(new CannotRetrieveKeyException("Random error"));
76
77 expectedException.expect(IllegalArgumentException.class);
78 expectedException.expectMessage(not(containsString(VALID_KEY_DATA)));
79
80
81 KeyProvider<PrivateKey> keyProvider = SystemPropertyKeyProvider.fromUri(VALID_URL, keyReader);
82 keyProvider.getKey(ValidatedKeyId.validate(VALID_KID));
83 }
84
85 @Test(expected = IllegalArgumentException.class)
86 public void shouldFailWhenSystemPropertyIsNotDefined() throws Exception {
87 KeyProvider<PrivateKey> keyProvider = SystemPropertyKeyProvider.fromUri(URI.create("sysprop:///asap.key"), keyReader);
88 keyProvider.getKey(ValidatedKeyId.validate(VALID_KID));
89 }
90
91 @Test(expected = CannotRetrieveKeyException.class)
92 public void shouldFailWhenKeyIdIsNotDefined() throws Exception {
93 KeyProvider<PrivateKey> keyProvider = SystemPropertyKeyProvider.fromUri(VALID_URL, keyReader);
94 keyProvider.getKey(ValidatedKeyId.validate("some/other/key/identifier"));
95 }
96
97 @Test(expected = IllegalArgumentException.class)
98 public void shouldFailToConstructIfUriDoesNotHaveSyspropSchema() throws Exception {
99 SystemPropertyKeyProvider.fromUri(new URI("sysprop:opaque"), keyReader);
100 }
101 }