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.mockito.Mock;
10 import org.mockito.junit.MockitoJUnit;
11 import org.mockito.junit.MockitoRule;
12
13 import java.io.InputStreamReader;
14 import java.net.URI;
15 import java.security.PrivateKey;
16 import java.security.interfaces.RSAPrivateKey;
17
18 import static org.junit.Assert.assertSame;
19 import static org.mockito.Matchers.any;
20 import static org.mockito.Mockito.verify;
21 import static org.mockito.Mockito.verifyNoMoreInteractions;
22 import static org.mockito.Mockito.when;
23
24 public class DataUriKeyProviderTest {
25 private static final String VALID_KID = "issuer/kid";
26 private static final URI VALID_DATA_URI = URI.create("data:application/pkcs8;kid=issuer%2Fkid;base64,EncodedKeyData");
27
28 @Rule
29 public final MockitoRule mockitoRule = MockitoJUnit.rule();
30
31 @Mock
32 private DataUriKeyReader keyReader;
33 @Mock
34 private RSAPrivateKey privateKey;
35
36 @Test
37 public void shouldBeAbleToReadKeyFromDataUri() throws Exception {
38 when(keyReader.readPrivateKey(any(InputStreamReader.class))).thenReturn(privateKey);
39 KeyProvider<PrivateKey> keyRetriever = new DataUriKeyProvider(VALID_DATA_URI, keyReader);
40
41 assertSame(privateKey, keyRetriever.getKey(ValidatedKeyId.validate(VALID_KID)));
42 }
43
44 @Test(expected = IllegalArgumentException.class)
45 public void shouldGetErrorWhenKeyParsingFails() throws Exception {
46 when(keyReader.readPrivateKey(any(InputStreamReader.class)))
47 .thenThrow(new CannotRetrieveKeyException("Random error"));
48 KeyProvider<PrivateKey> keyRetriever = new DataUriKeyProvider(VALID_DATA_URI, keyReader);
49
50 keyRetriever.getKey(ValidatedKeyId.validate(VALID_KID));
51 }
52
53 @Test(expected = IllegalArgumentException.class)
54 public void shouldFailWhenDataUriIsInvalid() throws Exception {
55 KeyProvider<PrivateKey> keyRetriever = new DataUriKeyProvider(URI.create("data:invalid"), keyReader);
56
57 keyRetriever.getKey(ValidatedKeyId.validate(VALID_KID));
58 }
59
60 @Test(expected = CannotRetrieveKeyException.class)
61 public void shouldFailWhenKeyIdIsNotDefined() throws Exception {
62 KeyProvider<PrivateKey> keyRetriever = new DataUriKeyProvider(VALID_DATA_URI, keyReader);
63
64 keyRetriever.getKey(ValidatedKeyId.validate("some/other/key/identifier"));
65 }
66
67 @Test
68 public void shouldParseKeyFromDataUriOnlyOnceOnConstruction() throws Exception {
69 when(keyReader.readPrivateKey(any(InputStreamReader.class))).thenReturn(privateKey);
70 KeyProvider<PrivateKey> keyRetriever = new DataUriKeyProvider(VALID_DATA_URI, keyReader);
71 verify(keyReader).readPrivateKey(any(InputStreamReader.class));
72
73 assertSame(privateKey, keyRetriever.getKey(ValidatedKeyId.validate(VALID_KID)));
74 verifyNoMoreInteractions(keyReader);
75 }
76 }