1 package com.atlassian.refapp.trustedapps.internal;
2
3 import com.atlassian.sal.api.pluginsettings.PluginSettings;
4 import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory;
5 import com.atlassian.security.auth.trustedapps.EncryptionProvider;
6
7 import java.security.KeyPair;
8 import java.security.NoSuchAlgorithmException;
9 import java.security.NoSuchProviderException;
10 import java.security.PrivateKey;
11 import java.security.PublicKey;
12 import java.util.Random;
13
14
15
16
17
18 public class KeyFactory {
19 private static final String PRIVATE_KEY = "trustedapps.private-key";
20 private static final String PUBLIC_KEY = "trustedapps.public-key";
21 private static final String APPLICTAION_ID = "trustedapps.application-id";
22
23 private EncryptionProvider encryptionProvider;
24 private PluginSettings pluginSettings;
25
26 public KeyFactory(EncryptionProvider encryptionProvider, PluginSettingsFactory pluginSettingsFactory) {
27 this.encryptionProvider = encryptionProvider;
28 pluginSettings = pluginSettingsFactory.createGlobalSettings();
29 }
30
31 public KeyPair getKeyPair() {
32 KeyPair keyPair;
33 if (pluginSettings.get(PRIVATE_KEY) != null) {
34 keyPair = fetchKeyPair();
35 } else {
36 keyPair = createKeyPair();
37 storeKeyPair(keyPair);
38 }
39 return keyPair;
40 }
41
42 public String getApplicationId() {
43 return (String) pluginSettings.get(APPLICTAION_ID);
44 }
45
46 private KeyPair createKeyPair() {
47 try {
48 return encryptionProvider.generateNewKeyPair();
49 } catch (NoSuchAlgorithmException e) {
50 throw new IllegalArgumentException("No such algorithm", e);
51 } catch (NoSuchProviderException e) {
52 throw new IllegalArgumentException("No such provider", e);
53 }
54 }
55
56 private void storeKeyPair(KeyPair keyPair) {
57 pluginSettings.put(PUBLIC_KEY, KeyUtils.encode(keyPair.getPublic()));
58 pluginSettings.put(PRIVATE_KEY, KeyUtils.encode(keyPair.getPrivate()));
59 pluginSettings.put(APPLICTAION_ID, "refapp:" + Integer.toString(new Random().nextInt(90000) + 10000));
60 }
61
62 private KeyPair fetchKeyPair() {
63 return new KeyPair(fetchPublicKey(), fetchPrivateKey());
64 }
65
66 private PrivateKey fetchPrivateKey() {
67 String keyStr = (String) pluginSettings.get(PRIVATE_KEY);
68 return KeyUtils.decodePrivateKey(encryptionProvider, keyStr);
69 }
70
71 private PublicKey fetchPublicKey() {
72 String keyStr = (String) pluginSettings.get(PUBLIC_KEY);
73 return KeyUtils.decodePublicKey(encryptionProvider, keyStr);
74 }
75
76 }