/**
* Copyright 2014 Liverpool John Moores University <http://www.ljmu.ac.uk/cmp/>
* Aniketos Project FP7-ICT-257930 <http://www.aniketos.eu>
* David Llewellyn-Jones <D.Llewellyn-Jones@ljmu.ac.uk>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
package eu.aniketos.ncvm.spdm.proxy;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateFactory;
import java.security.cert.CertificateParsingException;
import java.security.cert.X509Certificate;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import eu.aniketos.data.ISPDMService;
import eu.aniketos.data.ISPSRepository;
import eu.aniketos.data.ISecurityDescriptor;
import eu.aniketos.data.ISecurityProperty;
import eu.aniketos.data.IWebService;
import eu.aniketos.data.SPState;
import eu.aniketos.ncvm.spdm.client.ArrayOfISecurityProperty;
import eu.aniketos.ncvm.spdm.client.ArrayOfIWebService;
import eu.aniketos.ncvm.spdm.client.ISPDMServiceClient;
import eu.aniketos.ncvm.spdm.client.ISPDMServicePortType;
import eu.aniketos.ncvm.spdm.client.ObjectFactory;
import eu.aniketos.ncvm.userinterface.proxy.INCVMProxy;
public class SPDMProxy implements ISPDMService, INCVMProxy {
private URL wsdlURL = ISPDMServiceClient.WSDL_LOCATION;
private final static int timeout = 1 * 60 * 1000; // in milliseconds
@Override
public void setURL(String wsdlURL) {
try {
this.wsdlURL = new URL(wsdlURL);
} catch (MalformedURLException e) {
System.out.println("Failed to set SPDM URL to " + wsdlURL);
}
}
private ISPDMServicePortType getPort() {
QName SERVICE_NAME = new QName("http://api.ds.spdm.aniketos.eu/", "ISPDMService");
ISPDMServicePortType servicePort = null;
ISPDMServiceClient service = new ISPDMServiceClient(wsdlURL, SERVICE_NAME);
try {
servicePort = service.getISPDMServicePort();
Map<String, Object> requestContext = ((BindingProvider)servicePort).getRequestContext();
requestContext.put("javax.xml.ws.client.receiveTimeout", Integer.toString(timeout));
} catch (Exception exception) {
System.out.println("SPDM Proxy exception: " + exception.getMessage());
}
return servicePort;
}
private Set<ISecurityProperty> convertSecurityPropertiesFromWS(ArrayOfISecurityProperty properties) {
Set<ISecurityProperty> result = new HashSet<ISecurityProperty>();
result.clear();
Iterator<eu.aniketos.ncvm.spdm.client.ISecurityProperty> iter = properties.getISecurityProperty().iterator();
while (iter.hasNext()) {
result.add(convertSecurityPropertyFromWS(iter.next()));
}
return result;
}
private ArrayOfISecurityProperty convertSecurityPropertiesToWS(List<ISecurityProperty> properties) {
ArrayOfISecurityProperty result = new ArrayOfISecurityProperty();
result.getISecurityProperty().clear();
Iterator<ISecurityProperty> iter = properties.iterator();
while (iter.hasNext()) {
result.getISecurityProperty().add(convertSecurityPropertyToWS(iter.next()));
}
return result;
}
private Set<IWebService> convertWebServicesFromWS(ArrayOfIWebService properties) {
Set<IWebService> result = new HashSet<IWebService>();
result.clear();
Iterator<eu.aniketos.ncvm.spdm.client.IWebService> iter = properties.getIWebService().iterator();
while (iter.hasNext()) {
result.add(convertWebServiceFromWS (iter.next()));
}
return result;
}
private IWebService convertWebServiceFromWS(eu.aniketos.ncvm.spdm.client.IWebService webService) {
IWebService result = new WebService();
result.setServiceID(webService.getServiceID().getValue());
return result;
}
private eu.aniketos.ncvm.spdm.client.IWebService convertWebServiceToWS(IWebService webService) {
eu.aniketos.ncvm.spdm.client.IWebService result = new eu.aniketos.ncvm.spdm.client.IWebService();
ObjectFactory factory = new ObjectFactory();
result.setServiceID(factory.createIWebServiceServiceID(webService.getServiceID()));
return result;
}
private ISecurityProperty convertSecurityPropertyFromWS(eu.aniketos.ncvm.spdm.client.ISecurityProperty property) {
SecurityProperty result = new SecurityProperty();
result.setPropertyID(property.getPropertyID().getValue());
result.setPropertyValue(property.getPropertyValue().getValue());
XMLGregorianCalendar freshness = property.getFreshness();
if (freshness != null) {
result.setFreshness(freshness.toGregorianCalendar().getTime());
}
eu.aniketos.ncvm.spdm.client.X509Certificate certificate = property.getCertificate().getValue();
if (certificate != null) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(certificate);
byte[] data = bos.toByteArray();
bos.close();
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate x509Certificate = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(data));
result.setCertificate(x509Certificate);
}
catch (Exception e) {
System.out.println("Exception creating X509 Certificate: " + e.getMessage());
}
}
eu.aniketos.ncvm.spdm.client.SPState state = property.getState().getValue();
if (state != null) {
result.setState(convertStateFromWS(property.getState().getValue()));
}
return result;
}
private SPState convertStateFromWS(eu.aniketos.ncvm.spdm.client.SPState state) {
SPState result = SPState.Bind;
switch (state) {
case BIND:
result = SPState.Bind;
break;
case SIGNED:
result = SPState.Signed;
break;
case UN_BIND:
result = SPState.UnBind;
break;
case VERIFIED:
result = SPState.Verified;
break;
default:
result = eu.aniketos.data.SPState.valueOf(state.name());
break;
}
return result;
}
private eu.aniketos.ncvm.spdm.client.SPState convertStateToWS(SPState state) {
eu.aniketos.ncvm.spdm.client.SPState result = eu.aniketos.ncvm.spdm.client.SPState.BIND;
switch (state) {
case Bind:
result = eu.aniketos.ncvm.spdm.client.SPState.BIND;
break;
case Signed:
result = eu.aniketos.ncvm.spdm.client.SPState.SIGNED;
break;
case UnBind:
result = eu.aniketos.ncvm.spdm.client.SPState.UN_BIND;
break;
case Verified:
result = eu.aniketos.ncvm.spdm.client.SPState.VERIFIED;
break;
default:
result = eu.aniketos.ncvm.spdm.client.SPState.valueOf(state.name());
break;
}
return result;
}
private XMLGregorianCalendar convertDateToWS (Date date) throws DatatypeConfigurationException {
XMLGregorianCalendar result = null;
if (date != null) {
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(date);
result = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
}
return result;
}
private eu.aniketos.ncvm.spdm.client.ISecurityProperty convertSecurityPropertyToWS(ISecurityProperty property) {
eu.aniketos.ncvm.spdm.client.ISecurityProperty result = new eu.aniketos.ncvm.spdm.client.ISecurityProperty();
ObjectFactory factory = new ObjectFactory();
result.setPropertyID(factory.createISecurityPropertyPropertyID(property.getPropertyID()));
result.setPropertyValue(factory.createISecurityPropertyPropertyValue(property.getPropertyValue()));
try {
result.setFreshness(convertDateToWS(property.getFreshness()));
} catch (DatatypeConfigurationException e) {
System.out.printf("Failed to convert date: " + e.getLocalizedMessage());
}
SPState state = property.getState();
if (state != null) {
result.setState(factory.createISecurityPropertyState(convertStateToWS(state)));
}
try {
result.setCertificate(factory.createISecurityPropertyCertificate(convertX509CertificateToWS(property.getCertificate())));
} catch (CertificateEncodingException e) {
System.out.println("Warning: X509Certificate encoding could not be converted.");
} catch (CertificateParsingException e) {
System.out.println("Warning: X509Certificate failed to parse correctly.");
} catch (DatatypeConfigurationException e) {
System.out.println("Warning: X509Certificate error converting dates.");
}
return result;
}
private eu.aniketos.ncvm.spdm.client.ArrayOfString convertStringListToWS(List<String> stringList) {
eu.aniketos.ncvm.spdm.client.ObjectFactory factory = new eu.aniketos.ncvm.spdm.client.ObjectFactory();
eu.aniketos.ncvm.spdm.client.ArrayOfString result = factory.createArrayOfString();
result.getString().clear();
if (stringList != null) {
for (String string : stringList) {
result.getString().add(string);
}
}
return result;
}
private eu.aniketos.ncvm.spdm.client.ArrayOfArrayOfAnyType convertCollectionListToWS(Collection<List<?>> collectionList) {
eu.aniketos.ncvm.spdm.client.ObjectFactory factory = new eu.aniketos.ncvm.spdm.client.ObjectFactory();
eu.aniketos.ncvm.spdm.client.ArrayOfArrayOfAnyType result = factory.createArrayOfArrayOfAnyType();
result.getArrayOfAnyType().clear();
if (collectionList != null) {
for (List<?> list : collectionList) {
eu.aniketos.ncvm.spdm.client.ArrayOfAnyType resultList = factory.createArrayOfAnyType();
resultList.getAnyType().clear();
if (list != null) {
for (Object item : list) {
resultList.getAnyType().add(item);
}
}
}
}
return result;
}
private eu.aniketos.ncvm.spdm.client.Principal convertPrincipalToWS(java.security.Principal principal) {
eu.aniketos.ncvm.spdm.client.ObjectFactory factory = new eu.aniketos.ncvm.spdm.client.ObjectFactory();
eu.aniketos.ncvm.spdm.client.Principal result;
result = factory.createPrincipal();
result.setName(factory.createPrincipalName(principal.getName()));
return result;
}
private eu.aniketos.ncvm.spdm.client.ArrayOfBoolean convertyBooleanArrayToWS(boolean[] booleanArray) {
eu.aniketos.ncvm.spdm.client.ObjectFactory factory = new eu.aniketos.ncvm.spdm.client.ObjectFactory();
eu.aniketos.ncvm.spdm.client.ArrayOfBoolean result = factory.createArrayOfBoolean();
result.getBoolean().clear();
if (booleanArray != null) {
for (boolean item : booleanArray) {
result.getBoolean().add(item);
}
}
return result;
}
public eu.aniketos.ncvm.spdm.client.X500Principal convertX500PrincipalToWS(javax.security.auth.x500.X500Principal principal) {
eu.aniketos.ncvm.spdm.client.ObjectFactory factory = new eu.aniketos.ncvm.spdm.client.ObjectFactory();
eu.aniketos.ncvm.spdm.client.X500Principal result;
result = factory.createX500Principal();
result.setEncoded(factory.createCertificateEncoded(principal.getEncoded()));
result.setName(factory.createX500PrincipalName(principal.getName()));
return result;
}
private eu.aniketos.ncvm.spdm.client.PublicKey convertPublicKeyToWS(java.security.PublicKey publicKey) {
eu.aniketos.ncvm.spdm.client.ObjectFactory factory = new eu.aniketos.ncvm.spdm.client.ObjectFactory();
eu.aniketos.ncvm.spdm.client.PublicKey result;
result = factory.createPublicKey();
result.setAlgorithm(factory.createKeyAlgorithm(publicKey.getAlgorithm()));
result.setEncoded(factory.createKeyEncoded(publicKey.getEncoded()));
result.setFormat(factory.createKeyFormat(publicKey.getFormat()));
return result;
}
private eu.aniketos.ncvm.spdm.client.X509Certificate convertX509CertificateToWS (X509Certificate certificate) throws CertificateEncodingException, CertificateParsingException, DatatypeConfigurationException {
eu.aniketos.ncvm.spdm.client.ObjectFactory factory = new eu.aniketos.ncvm.spdm.client.ObjectFactory();
eu.aniketos.ncvm.spdm.client.X509Certificate result = null;
if (certificate != null) {
result = new eu.aniketos.ncvm.spdm.proxy.X509Certificate();
result.setBasicConstraints(certificate.getBasicConstraints());
result.setEncoded(factory.createCertificateEncoded(certificate.getEncoded()));
result.setExtendedKeyUsage(factory.createX509CertificateExtendedKeyUsage(convertStringListToWS(certificate.getExtendedKeyUsage())));
result.setIssuerAlternativeNames(factory.createX509CertificateIssuerAlternativeNames(convertCollectionListToWS(certificate.getIssuerAlternativeNames())));
result.setIssuerDN(factory.createX509CertificateIssuerDN(convertPrincipalToWS(certificate.getIssuerDN())));
result.setIssuerUniqueID(factory.createX509CertificateIssuerUniqueID(convertyBooleanArrayToWS(certificate.getIssuerUniqueID())));
result.setIssuerX500Principal(factory.createX509CertificateIssuerX500Principal(convertX500PrincipalToWS(certificate.getIssuerX500Principal())));
result.setKeyUsage(factory.createX509CertificateIssuerUniqueID(convertyBooleanArrayToWS(certificate.getKeyUsage())));
result.setNotAfter(convertDateToWS(certificate.getNotAfter()));
result.setNotBefore(convertDateToWS(certificate.getNotBefore()));
result.setPublicKey(factory.createCertificatePublicKey(convertPublicKeyToWS(certificate.getPublicKey())));
result.setSerialNumber(factory.createX509CertificateSerialNumber(certificate.getSerialNumber()));
result.setSigAlgName(factory.createX509CertificateSigAlgName(certificate.getSigAlgName()));
result.setSigAlgOID(factory.createX509CertificateSigAlgOID(certificate.getSigAlgOID()));
result.setSigAlgParams(factory.createX509CertificateSigAlgParams(certificate.getSigAlgParams()));
result.setSignature(factory.createX509CertificateSignature(certificate.getSignature()));
result.setSubjectAlternativeNames(factory.createX509CertificateSubjectAlternativeNames(convertCollectionListToWS(certificate.getSubjectAlternativeNames())));
result.setSubjectDN(factory.createX509CertificateSubjectDN(convertPrincipalToWS(certificate.getSubjectDN())));
result.setSubjectUniqueID(factory.createX509CertificateSubjectUniqueID(convertyBooleanArrayToWS(certificate.getSubjectUniqueID())));
result.setSubjectX500Principal(factory.createX509CertificateIssuerX500Principal(convertX500PrincipalToWS(certificate.getSubjectX500Principal())));
result.setTBSCertificate(factory.createX509CertificateTBSCertificate(certificate.getTBSCertificate()));
result.setType(factory.createCertificateType(certificate.getType()));
result.setVersion(certificate.getVersion());
}
return result;
}
private eu.aniketos.ncvm.spdm.client.ISecurityDescriptor convertSecurityDescriptorToWS(ISecurityDescriptor descriptor) {
eu.aniketos.ncvm.spdm.client.ISecurityDescriptor result = new eu.aniketos.ncvm.spdm.client.ISecurityDescriptor();
ArrayOfISecurityProperty properties;
ObjectFactory factory = new ObjectFactory();
properties = convertSecurityPropertiesToWS(descriptor.getProperties());
result.setProperties(factory.createISecurityDescriptorProperties(properties));
return result;
}
@Override
public int cache_size() {
ISPDMServicePortType servicePort = getPort();
int result = 0;
if (servicePort != null) {
result = servicePort.cacheSize();
}
return result;
}
@Override
public void emptyCache() {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.emptyCache();
}
}
@Override
public ISPSRepository fetchRepository() {
ISPDMServicePortType servicePort = getPort();
eu.aniketos.ncvm.spdm.client.ISPSRepository result = null;
if (servicePort != null) {
result = servicePort.fetchRepository();
}
return (ISPSRepository)result;
}
@Override
public Set<ISecurityProperty> getProperties(IWebService arg0, SPState arg1) {
ISPDMServicePortType servicePort = getPort();
ArrayOfISecurityProperty result = new ArrayOfISecurityProperty();
if (servicePort != null) {
result = servicePort.getProperties(convertWebServiceToWS(arg0), eu.aniketos.ncvm.spdm.client.SPState.fromValue(arg1.name()));
}
return convertSecurityPropertiesFromWS(result);
}
@Override
public ISecurityProperty getSecurityProperty(String arg0) {
ISPDMServicePortType servicePort = getPort();
ISecurityProperty result = null;
if (servicePort != null) {
result = convertSecurityPropertyFromWS(servicePort.getSecurityProperty(arg0));
}
return result;
}
//@Override
public int updateSecurityProperty(String serviceID, String sp_id, String update_value) {
ISPDMServicePortType servicePort = getPort();
int result = -1;
if (servicePort != null) {
result = servicePort.updateSecurityProperty(serviceID, sp_id, update_value);
}
return result;
}
@Override
public ISecurityProperty getSecurityProperty(String arg0, String arg1) {
ISPDMServicePortType servicePort = getPort();
ISecurityProperty result = null;
if (servicePort != null) {
result = convertSecurityPropertyFromWS(servicePort.getSecurityProperty1(arg0, arg1));
}
return result;
}
@Override
public IWebService getService(String arg0) {
ISPDMServicePortType servicePort = getPort();
IWebService result = null;
if (servicePort != null) {
result = convertWebServiceFromWS (servicePort.getService(arg0));
}
return result;
}
@Override
public Set<ISecurityProperty> getVerifiedProperties(IWebService arg0) {
ISPDMServicePortType servicePort = getPort();
ArrayOfISecurityProperty result = new ArrayOfISecurityProperty();
if (servicePort != null) {
result = servicePort.getVerifiedProperties(convertWebServiceToWS(arg0));
}
return convertSecurityPropertiesFromWS(result);
}
@Override
public Set<ISecurityProperty> lookUpSecurityProperty(IWebService arg0) {
ISPDMServicePortType servicePort = getPort();
ArrayOfISecurityProperty result = new ArrayOfISecurityProperty();
if (servicePort != null) {
result = servicePort.lookUpSecurityProperty(convertWebServiceToWS(arg0));
}
return convertSecurityPropertiesFromWS(result);
}
@Override
public Set<IWebService> lookupService(ISecurityProperty arg0) {
ISPDMServicePortType servicePort = getPort();
ArrayOfIWebService result = new ArrayOfIWebService();
if (servicePort != null) {
result = servicePort.lookupService(convertSecurityPropertyToWS(arg0));
}
return convertWebServicesFromWS(result);
}
@Override
public void persist_cache() {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.persistCache();
}
}
@Override
public void print_repository() {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.printRepository();
}
}
@Override
public void print_sp_entries() {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.printSpEntries();
}
}
@Override
public void print_ws_entries() {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.printWsEntries();
}
}
@Override
public void registerService(IWebService arg0, ISecurityProperty arg1) {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.registerService1(convertWebServiceToWS(arg0), convertSecurityPropertyToWS(arg1));
}
}
@Override
public void registerService(IWebService arg0, ISecurityDescriptor arg1) {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.registerService(convertWebServiceToWS(arg0), convertSecurityDescriptorToWS(arg1));
}
}
//@Override
public void setTestResults(String result) {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.setTestResults(result);
}
}
//@Override
public void startTest() {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.startTest();
}
}
//@Override
public String getTestResults() {
ISPDMServicePortType servicePort = getPort();
String result = null;
if (servicePort != null) {
result = servicePort.getTestResults();
}
return result;
}
@Override
public void removeSeucrityProeprty(ISecurityProperty arg0) {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.removeSeucrityProeprty(convertSecurityPropertyToWS(arg0));
}
}
@Override
public void unregisterService(IWebService arg0) {
ISPDMServicePortType servicePort = getPort();
if (servicePort != null) {
servicePort.unregisterService(convertWebServiceToWS(arg0));
}
}
}