blob: 2457c1b2c423da60abcbccae4d43a44634a65d9b [file] [log] [blame]
/*
* Copyright (C) 2009 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.polo.pairing;
import com.google.polo.exception.PoloException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.cert.Certificate;
import javax.net.ssl.SSLSocket;
/**
* Container class for various bits of state related to a pairing session.
*/
public class PairingContext {
/**
* The {@link Certificate} of the local endpoint of the protocol.
*/
private Certificate mLocalCertificate;
/**
* The {@link Certificate} of the remote endpoint of the protocol.
*/
private Certificate mPeerCertificate;
/**
* An {@link InputStream} for the peer in the protocol.
*/
private InputStream mPeerInputStream;
/**
* An {@link OutputStream} for the peer in the protocol.
*/
private OutputStream mPeerOutputStream;
/**
* {@code true} if this context is for a server endpoint.
*/
private final boolean mIsServer;
/**
* Constructs a new instance.
*
* @param localCertificate the local endpoint's {@link Certificate}
* @param peerCertificate the remote endpoint's {@link Certificate}
* @param peerInputStream an {@link InputStream} from the peer
* @param peerOutputStream a {@link OutputStream} to the peer
* @param isServer {@code true} if this endpoint it the server
*/
public PairingContext(Certificate localCertificate,
Certificate peerCertificate, InputStream peerInputStream,
OutputStream peerOutputStream, boolean isServer) {
setLocalCertificate(localCertificate);
setPeerCertificate(peerCertificate);
setPeerInputStream(peerInputStream);
setPeerOutputStream(peerOutputStream);
mIsServer = isServer;
}
/**
* Constructs a new instance from an {@link SSLSocket}.
*
* @param socket the socket to use
* @param isServer {@code true} if this endpoint is the server
* @return the new instance
* @throws PoloException if certificates could not be obtained
* @throws IOException if the socket's streams could not be obtained
*/
public static PairingContext fromSslSocket(SSLSocket socket, boolean isServer)
throws PoloException, IOException {
Certificate localCert = PoloUtil.getLocalCert(socket.getSession());
Certificate peerCert = PoloUtil.getPeerCert(socket.getSession());
InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();
return new PairingContext(localCert, peerCert, input, output, isServer);
}
public void setLocalCertificate(Certificate localCertificate) {
mLocalCertificate = localCertificate;
}
public Certificate getClientCertificate() {
if (isServer()) {
return mPeerCertificate;
} else {
return mLocalCertificate;
}
}
public void setPeerCertificate(Certificate peerCertificate) {
mPeerCertificate = peerCertificate;
}
public Certificate getServerCertificate() {
if (isServer()) {
return mLocalCertificate;
} else {
return mPeerCertificate;
}
}
public void setPeerInputStream(InputStream peerInputStream) {
mPeerInputStream = peerInputStream;
}
public InputStream getPeerInputStream() {
return mPeerInputStream;
}
public void setPeerOutputStream(OutputStream peerOutputStream) {
mPeerOutputStream = peerOutputStream;
}
public OutputStream getPeerOutputStream() {
return mPeerOutputStream;
}
public boolean isServer() {
return mIsServer;
}
public boolean isClient() {
return !(isServer());
}
}