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.DataUriUtil;
6 import com.atlassian.asap.core.keys.KeyProvider;
7 import com.atlassian.asap.core.validator.ValidatedKeyId;
8
9 import java.io.StringReader;
10 import java.net.URI;
11 import java.security.PrivateKey;
12
13 import static com.google.common.base.Preconditions.checkArgument;
14
15
16
17
18
19
20 public class DataUriKeyProvider implements KeyProvider<PrivateKey> {
21 static final String URI_SCHEME = "data";
22
23 private final String dataUriKeyId;
24 private final PrivateKey privateKey;
25
26 public DataUriKeyProvider(URI dataUri, DataUriKeyReader dataUriKeyReader) {
27 checkArgument(dataUri.isAbsolute(), "URI must be absolute");
28 checkArgument(dataUri.isOpaque(), "URI must not have path components");
29 checkArgument(URI_SCHEME.equals(dataUri.getScheme()), "URI must have data scheme");
30
31 this.dataUriKeyId = DataUriUtil.getKeyId(dataUri.toString());
32 this.privateKey = getKeyFromDataUri(dataUri, dataUriKeyReader);
33 }
34
35 @Override
36 public PrivateKey getKey(ValidatedKeyId keyId) throws CannotRetrieveKeyException {
37 if (dataUriKeyId.equals(keyId.getKeyId())) {
38 return privateKey;
39 } else {
40 throw new CannotRetrieveKeyException("Unrecognized key id: " + keyId.getKeyId());
41 }
42 }
43
44 private static PrivateKey getKeyFromDataUri(URI dataUri, DataUriKeyReader keyReader) {
45 try (StringReader reader = new StringReader(dataUri.toString())) {
46 return keyReader.readPrivateKey(reader);
47 } catch (CannotRetrieveKeyException ex) {
48 throw new IllegalArgumentException("Unable to parse key from data uri", ex);
49 }
50 }
51
52 @Override
53 public String toString() {
54 return this.getClass().getSimpleName();
55 }
56 }