Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Do not merge. Custom TCP Stream #651

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions core/src/saros/context/CoreContextFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import saros.net.internal.XMPPTransmitter;
import saros.net.stream.IBBStreamService;
import saros.net.stream.IStreamService;
import saros.net.stream.Socks5StreamService;
import saros.net.stream.TCPTransport;
import saros.net.stun.IStunService;
import saros.net.stun.internal.StunServiceImpl;
import saros.net.upnp.IUPnPAccess;
Expand Down Expand Up @@ -82,7 +82,7 @@ private final Component[] getContextComponents() {
IBBStreamService.class),
Component.create(
BindKey.bindKey(IStreamService.class, IContextKeyBindings.Socks5StreamService.class),
Socks5StreamService.class),
TCPTransport.class /*Socks5StreamService.class*/),
Component.create(RosterTracker.class),
Component.create(XMPPConnectionService.class),
Component.create(IStunService.class, StunServiceImpl.class),
Expand Down
6 changes: 5 additions & 1 deletion core/src/saros/misc/xstream/XStreamExtensionProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.SingleValueConverter;
import com.thoughtworks.xstream.converters.basic.BooleanConverter;
import com.thoughtworks.xstream.converters.basic.StringConverter;
import com.thoughtworks.xstream.io.xml.CompactWriter;
import java.io.IOException;
import java.io.StringWriter;
Expand Down Expand Up @@ -221,7 +223,9 @@ public T getPayload() {
public static class XStreamPacketExtension<T> implements PacketExtension {

/** Necessary for Smack */
@XStreamAsAttribute protected String xmlns;
@XStreamConverter(StringConverter.class)
@XStreamAsAttribute
protected String xmlns;

protected T payload;

Expand Down
100 changes: 100 additions & 0 deletions core/src/saros/net/stream/CertificateUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package saros.net.stream;

import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import org.apache.log4j.Logger;

// taken from https://gist.github.com/mikeapr4/3b2b5d05bc57640e77d0#file-certificateutils-java

public class CertificateUtils {

private static final Logger log = Logger.getLogger(CertificateUtils.class);

private static final String KEY_TYPE_RSA = "RSA";
private static final String SIG_ALG_SHA_RSA = "SHA256WithRSA";
private static final int KEY_SIZE = 1024;
private static final long CERT_VALIDITY = 365 * 24 * 3600L;
private static final String ALIAS_PRIVATE = "private";
private static final String ALIAS_CERT = "cert";

/** The password for each created store. */
public static final String KEY_STORE_PASSWORD =
"notReallyImportant"; // this would only ever be relevant if/when persisted.

/**
* @param certValues e.g. CN=Dave, OU=JavaSoft, O=Sun Microsystems, C=US
* @return
*/
public static KeyStore createSelfSigned(final String certValues) {
/*
* When accessing the classes we get an error, requiring some compile settings to change.
* However the build will still fail, so use reflection instead.
*/
try {
// CertAndKeyGen keyGen = new CertAndKeyGen(KEY_TYPE_RSA, SIG_ALG_SHA_RSA);

final Class<?> keyGenClass = Class.forName("sun.security.tools.keytool.CertAndKeyGen");

final Object keyGen =
keyGenClass
.getConstructor(String.class, String.class)
.newInstance(KEY_TYPE_RSA, SIG_ALG_SHA_RSA);

// keyGen.generate(KEY_SIZE);

keyGenClass.getMethod("generate", int.class).invoke(keyGen, KEY_SIZE);

final KeyStore ks = emptyStore();

if (ks == null) return null;

// X509Certificate certificate = keyGen.getSelfCertificate(new X500Name(certValues),
// CERT_VALIDITY);

Class<?> x500NameClass = Class.forName("sun.security.x509.X500Name");

Object x500Name = x500NameClass.getConstructor(String.class).newInstance(certValues);

final X509Certificate certificate =
(X509Certificate)
keyGenClass
.getMethod("getSelfCertificate", x500NameClass, long.class)
.invoke(keyGen, x500Name, CERT_VALIDITY);

final Key privateKey = (Key) keyGenClass.getMethod("getPrivateKey").invoke(keyGen);
ks.setCertificateEntry(ALIAS_CERT, certificate);

ks.setKeyEntry(
ALIAS_PRIVATE,
privateKey,
KEY_STORE_PASSWORD.toCharArray(),
new Certificate[] {certificate});

return ks;

} catch (Exception e) {
log.error("cannot create self signed certificate", e);
}
return null;
}

public static KeyStore createSelfSignedForHost(final String host) {
return createSelfSigned("CN=" + host);
}

private static KeyStore emptyStore() {
try {
final KeyStore ks = KeyStore.getInstance("JKS");

// Loading creates the store, can't do anything with it until it's loaded
ks.load(null, KEY_STORE_PASSWORD.toCharArray());
return ks;
} catch (Exception e) {
log.error("cannot create empty keystore", e);
}

return null;
}
}
Loading