1 /*
2  * Copyright (C) 2009 Google Inc.  All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.polo.pairing;
18 
19 import com.google.polo.exception.PoloException;
20 
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.io.OutputStream;
24 import java.security.cert.Certificate;
25 
26 import javax.net.ssl.SSLSocket;
27 
28 /**
29  * Container class for various bits of state related to a pairing session.
30  */
31 public class PairingContext {
32 
33   /**
34    * The {@link Certificate} of the local endpoint of the protocol.
35    */
36   private Certificate mLocalCertificate;
37 
38   /**
39    * The {@link Certificate} of the remote endpoint of the protocol.
40    */
41   private Certificate mPeerCertificate;
42 
43   /**
44    * An {@link InputStream} for the peer in the protocol.
45    */
46   private InputStream mPeerInputStream;
47 
48   /**
49    * An {@link OutputStream} for the peer in the protocol.
50    */
51   private OutputStream mPeerOutputStream;
52 
53   /**
54    * {@code true} if this context is for a server endpoint.
55    */
56   private final boolean mIsServer;
57 
58   /**
59    * Constructs a new instance.
60    *
61    * @param localCertificate  the local endpoint's {@link Certificate}
62    * @param peerCertificate   the remote endpoint's {@link Certificate}
63    * @param peerInputStream   an {@link InputStream} from the peer
64    * @param peerOutputStream  a {@link OutputStream} to the peer
65    * @param isServer          {@code true} if this endpoint it the server
66    */
PairingContext(Certificate localCertificate, Certificate peerCertificate, InputStream peerInputStream, OutputStream peerOutputStream, boolean isServer)67   public PairingContext(Certificate localCertificate,
68       Certificate peerCertificate, InputStream peerInputStream,
69       OutputStream peerOutputStream, boolean isServer) {
70     setLocalCertificate(localCertificate);
71     setPeerCertificate(peerCertificate);
72     setPeerInputStream(peerInputStream);
73     setPeerOutputStream(peerOutputStream);
74     mIsServer = isServer;
75   }
76 
77   /**
78    * Constructs a new instance from an {@link SSLSocket}.
79    *
80    * @param   socket          the socket to use
81    * @param   isServer        {@code true} if this endpoint is the server
82    * @return  the new instance
83    * @throws PoloException  if certificates could not be obtained
84    * @throws IOException    if the socket's streams could not be obtained
85    */
fromSslSocket(SSLSocket socket, boolean isServer)86   public static PairingContext fromSslSocket(SSLSocket socket, boolean isServer)
87       throws PoloException, IOException {
88     Certificate localCert = PoloUtil.getLocalCert(socket.getSession());
89     Certificate peerCert = PoloUtil.getPeerCert(socket.getSession());
90     InputStream input = socket.getInputStream();
91     OutputStream output = socket.getOutputStream();
92     return new PairingContext(localCert, peerCert, input, output, isServer);
93   }
94 
setLocalCertificate(Certificate localCertificate)95   public void setLocalCertificate(Certificate localCertificate) {
96     mLocalCertificate = localCertificate;
97   }
98 
getClientCertificate()99   public Certificate getClientCertificate() {
100     if (isServer()) {
101       return mPeerCertificate;
102     } else {
103       return mLocalCertificate;
104     }
105   }
106 
setPeerCertificate(Certificate peerCertificate)107   public void setPeerCertificate(Certificate peerCertificate) {
108     mPeerCertificate = peerCertificate;
109   }
110 
getServerCertificate()111   public Certificate getServerCertificate() {
112     if (isServer()) {
113       return mLocalCertificate;
114     } else {
115       return mPeerCertificate;
116     }
117   }
118 
setPeerInputStream(InputStream peerInputStream)119   public void setPeerInputStream(InputStream peerInputStream) {
120     mPeerInputStream = peerInputStream;
121   }
122 
getPeerInputStream()123   public InputStream getPeerInputStream() {
124     return mPeerInputStream;
125   }
126 
setPeerOutputStream(OutputStream peerOutputStream)127   public void setPeerOutputStream(OutputStream peerOutputStream) {
128     mPeerOutputStream = peerOutputStream;
129   }
130 
getPeerOutputStream()131   public OutputStream getPeerOutputStream() {
132     return mPeerOutputStream;
133   }
134 
isServer()135   public boolean isServer() {
136     return mIsServer;
137   }
138 
isClient()139   public boolean isClient() {
140     return !(isServer());
141   }
142 
143 }
144