blob: 2457c1b2c423da60abcbccae4d43a44634a65d9b [file] [log] [blame]
Jerome Poichet7c997852014-05-20 10:50:05 -07001/*
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
17package com.google.polo.pairing;
18
19import com.google.polo.exception.PoloException;
20
21import java.io.IOException;
22import java.io.InputStream;
23import java.io.OutputStream;
24import java.security.cert.Certificate;
25
26import javax.net.ssl.SSLSocket;
27
28/**
29 * Container class for various bits of state related to a pairing session.
30 */
31public 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 */
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 */
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
95 public void setLocalCertificate(Certificate localCertificate) {
96 mLocalCertificate = localCertificate;
97 }
98
99 public Certificate getClientCertificate() {
100 if (isServer()) {
101 return mPeerCertificate;
102 } else {
103 return mLocalCertificate;
104 }
105 }
106
107 public void setPeerCertificate(Certificate peerCertificate) {
108 mPeerCertificate = peerCertificate;
109 }
110
111 public Certificate getServerCertificate() {
112 if (isServer()) {
113 return mLocalCertificate;
114 } else {
115 return mPeerCertificate;
116 }
117 }
118
119 public void setPeerInputStream(InputStream peerInputStream) {
120 mPeerInputStream = peerInputStream;
121 }
122
123 public InputStream getPeerInputStream() {
124 return mPeerInputStream;
125 }
126
127 public void setPeerOutputStream(OutputStream peerOutputStream) {
128 mPeerOutputStream = peerOutputStream;
129 }
130
131 public OutputStream getPeerOutputStream() {
132 return mPeerOutputStream;
133 }
134
135 public boolean isServer() {
136 return mIsServer;
137 }
138
139 public boolean isClient() {
140 return !(isServer());
141 }
142
143}