Adding interfaces in documentation
[aai/sparky-be.git] / sparkybe-onap-service / src / main / java / org / onap / aai / sparky / security / SecurityContextFactoryImpl.java
1 /**
2  * ============LICENSE_START===================================================
3  * SPARKY (AAI UI service)
4  * ============================================================================
5  * Copyright © 2017 AT&T Intellectual Property.
6  * Copyright © 2017 Amdocs
7  * All rights reserved.
8  * ============================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=====================================================
21  *
22  * ECOMP and OpenECOMP are trademarks
23  * and service marks of AT&T Intellectual Property.
24  */
25 package org.onap.aai.sparky.security;
26
27 import java.io.ByteArrayInputStream;
28 import java.io.File;
29 import java.io.FileInputStream;
30 import java.io.IOException;
31 import java.nio.file.Files;
32 import java.security.KeyManagementException;
33 import java.security.KeyStore;
34 import java.security.KeyStoreException;
35 import java.security.NoSuchAlgorithmException;
36 import java.security.UnrecoverableKeyException;
37 import java.security.cert.CertificateException;
38 import java.security.cert.X509Certificate;
39
40 import javax.net.ssl.KeyManagerFactory;
41 import javax.net.ssl.SSLContext;
42 import javax.net.ssl.TrustManager;
43 import javax.net.ssl.X509TrustManager;
44
45 /**
46  * The Class SecurityContextFactoryImpl.
47  */
48 public class SecurityContextFactoryImpl implements SecurityContextFactory {
49
50   protected String sslAlgorithm;
51   protected String keyManagerAlgortihm;
52   protected String keyStoreType;
53   protected boolean serverCertificationChainValidationEnabled;
54   protected String trustStoreFileName;
55   protected String clientCertPassword;
56   protected FileInputStream clientCertFileInputStream;
57   protected String clientCertFileName;
58   protected byte[] clientCertBytes;
59
60   /**
61    * Instantiates a new security context factory impl.
62    */
63   public SecurityContextFactoryImpl() {
64     this.sslAlgorithm = "TLS";
65     this.keyManagerAlgortihm = "SunX509";
66     this.keyStoreType = "PKCS12";
67     this.serverCertificationChainValidationEnabled = false;
68     this.clientCertFileInputStream = null;
69     this.clientCertFileName = null;
70   }
71
72   @Override
73   public String getSslAlgorithm() {
74     return sslAlgorithm;
75   }
76
77   @Override
78   public void setSslAlgorithm(String sslAlgorithm) {
79     this.sslAlgorithm = sslAlgorithm;
80   }
81
82   @Override
83   public String getKeyManagerAlgortihm() {
84     return keyManagerAlgortihm;
85   }
86
87   @Override
88   public void setKeyManagerAlgortihm(String keyManagerAlgortihm) {
89     this.keyManagerAlgortihm = keyManagerAlgortihm;
90   }
91
92   @Override
93   public String getKeyStoreType() {
94     return keyStoreType;
95   }
96
97   @Override
98   public void setKeyStoreType(String keyStoreType) {
99     this.keyStoreType = keyStoreType;
100   }
101
102   @Override
103   public boolean isServerCertificationChainValidationEnabled() {
104     return serverCertificationChainValidationEnabled;
105   }
106
107   @Override
108   public void setServerCertificationChainValidationEnabled(
109       boolean serverCertificationChainValidationEnabled) {
110     this.serverCertificationChainValidationEnabled = serverCertificationChainValidationEnabled;
111   }
112
113   @Override
114   public void setClientCertFileName(String filename) throws IOException {
115     this.clientCertFileName = filename;
116     
117     if (filename == null) {
118       this.clientCertBytes = null;
119     } else {
120       this.clientCertBytes = Files.readAllBytes(new File(filename).toPath());
121     }
122   }
123
124   @Override
125   public void setClientCertFileInputStream(FileInputStream fis) {
126     this.clientCertFileInputStream = fis;
127   }
128
129   @Override
130   public FileInputStream getClientCertFileInputStream() {
131     return this.clientCertFileInputStream;
132   }
133
134   @Override
135   public SSLContext getSecureContext() throws KeyManagementException, NoSuchAlgorithmException,
136       KeyStoreException, CertificateException, IOException, UnrecoverableKeyException {
137
138     TrustManager[] trustAllCerts = null;
139
140     if (serverCertificationChainValidationEnabled) {
141
142       System.setProperty("javax.net.ssl.trustStore", trustStoreFileName);
143
144     } else {
145
146       // Create a trust manager that does not validate certificate chains
147       trustAllCerts = new TrustManager[] {new X509TrustManager() {
148         @Override
149         public X509Certificate[] getAcceptedIssuers() {
150           return null;
151         }
152
153         @Override
154         public void checkClientTrusted(X509Certificate[] certs, String authType) {}
155
156         @Override
157         public void checkServerTrusted(X509Certificate[] certs, String authType) {}
158       } };
159     }
160
161     KeyManagerFactory kmf = KeyManagerFactory.getInstance(keyManagerAlgortihm);
162
163     KeyStore ks = KeyStore.getInstance(keyStoreType);
164
165     char[] pwd = null;
166     if (clientCertPassword != null) {
167       pwd = clientCertPassword.toCharArray();
168     }
169     
170     if (clientCertBytes != null) {
171       ks.load(new ByteArrayInputStream(clientCertBytes), pwd);
172     } else {
173       ks.load(null, pwd);
174     }
175
176     kmf.init(ks, pwd);
177
178     SSLContext ctx = SSLContext.getInstance(sslAlgorithm);
179     ctx.init(kmf.getKeyManagers(), trustAllCerts, null);
180
181     return ctx;
182
183   }
184
185   @Override
186   public String getTrustStoreFileName() {
187     return this.trustStoreFileName;
188   }
189
190   @Override
191   public void setTrustStoreFileName(String filename) {
192     this.trustStoreFileName = filename;
193   }
194
195   @Override
196   public String getClientCertPassword() {
197     return this.clientCertPassword;
198   }
199
200   @Override
201   public void setClientCertPassword(String password) {
202     this.clientCertPassword = password;
203   }
204
205 }