bio.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #ifndef SQUID_SSL_BIO_H
10 #define SQUID_SSL_BIO_H
11 
12 #if USE_OPENSSL
13 
14 #include "FadingCounter.h"
15 #include "fd.h"
16 #include "security/Handshake.h"
17 
18 #include <iosfwd>
19 #include <list>
20 #if HAVE_OPENSSL_BIO_H
21 #include <openssl/bio.h>
22 #endif
23 #include <string>
24 #include <type_traits>
25 
26 namespace Ssl
27 {
28 
30 class Bio
31 {
32 public:
33  explicit Bio(const int anFd);
34  virtual ~Bio();
35 
37  virtual int write(const char *buf, int size, BIO *table);
38 
40  virtual int read(char *buf, int size, BIO *table);
41 
44  virtual void flush(BIO *table) {}
45 
46  int fd() const { return fd_; }
47 
50  virtual void stateChanged(const SSL *ssl, int where, int ret);
51 
54  static BIO *Create(const int fd, Security::Io::Type type);
56  static void Link(SSL *ssl, BIO *bio);
57 
58  const SBuf &rBufData() {return rbuf;}
59 protected:
60  const int fd_;
62 };
63 
67 class ClientBio: public Bio
68 {
69 public:
70  explicit ClientBio(const int anFd);
71 
75  virtual void stateChanged(const SSL *ssl, int where, int ret);
77  virtual int write(const char *buf, int size, BIO *table);
81  virtual int read(char *buf, int size, BIO *table);
83  void hold(bool h) {holdRead_ = holdWrite_ = h;}
84 
89 private:
91  static const time_t RenegotiationsWindow = 10;
92 
94  static const int RenegotiationsLimit = 5;
95 
96  bool holdRead_;
97  bool holdWrite_;
98  int helloSize;
100 
102  const char *abortReason;
103 };
104 
120 class ServerBio: public Bio
121 {
122 public:
123  explicit ServerBio(const int anFd);
124 
126  virtual void stateChanged(const SSL *ssl, int where, int ret);
131  virtual int write(const char *buf, int size, BIO *table);
134  virtual int read(char *buf, int size, BIO *table);
137  virtual void flush(BIO *table);
139  void setClientFeatures(Security::TlsDetails::Pointer const &details, SBuf const &hello);
140 
141  bool resumingSession();
142 
144  bool holdWrite() const {return holdWrite_;}
146  void holdWrite(bool h) {holdWrite_ = h;}
148  bool holdRead() const {return holdRead_;}
150  void holdRead(bool h) {holdRead_ = h;}
152  void recordInput(bool r) {record_ = r;}
154  bool canSplice() {return allowSplice;}
156  bool canBump() {return allowBump;}
158  void mode(Ssl::BumpMode m) {bumpMode_ = m;}
160 
162  bool gotHello() const { return (parsedHandshake && !parseError); }
163 
165  bool gotHelloFailed() const { return (parsedHandshake && parseError); }
166 
169 
172 
173 private:
174  int readAndGive(char *buf, const int size, BIO *table);
175  int readAndParse(char *buf, const int size, BIO *table);
176  int readAndBuffer(BIO *table);
177  int giveBuffered(char *buf, const int size);
178 
185  bool helloBuild;
186  bool allowSplice;
187  bool allowBump;
188  bool holdWrite_;
189  bool holdRead_;
190  bool record_;
192  bool parseError;
194 
198 };
199 
200 } // namespace Ssl
201 
202 void
204 
205 #if !HAVE_LIBCRYPTO_BIO_GET_INIT
206 // OpenSSL v1.0 bio compatibility functions
207 inline void *BIO_get_data(BIO *table) { return table->ptr; }
208 inline void BIO_set_data(BIO *table, void *data) { table->ptr = data; }
209 inline int BIO_get_init(BIO *table) { return table->init; }
210 inline void BIO_set_init(BIO *table, int init) { table->init = init; }
211 #endif
212 
213 #endif /* USE_OPENSSL */
214 #endif /* SQUID_SSL_BIO_H */
215 
static BIO * Create(const int fd, Security::Io::Type type)
Definition: bio.cc:66
Incremental TLS/SSL Handshake parser.
Definition: Handshake.h:56
Ssl::BumpMode bumpMode_
Definition: bio.h:193
const SBuf & rBufData()
The buffered input data.
Definition: bio.h:58
int type
Definition: errorpage.cc:79
Definition: SBuf.h:87
Security::TlsDetails::Pointer clientTlsDetails
SSL client features extracted from ClientHello message or SSL object.
Definition: bio.h:180
static void Link(SSL *ssl, BIO *bio)
Tells ssl connection to use BIO and monitor state via stateChanged()
Definition: bio.cc:92
virtual void flush(BIO *table)
Definition: bio.h:44
virtual int write(const char *buf, int size, BIO *table)
The ClientBio version of the Ssl::Bio::write method.
Definition: bio.cc:203
bool canSplice()
Whether we can splice or not the SSL stream.
Definition: bio.h:154
virtual int write(const char *buf, int size, BIO *table)
Writes the given data to socket.
Definition: bio.cc:108
const char * bumpMode(int bm)
Definition: support.h:139
const int fd_
the SSL socket we are reading and writing
Definition: bio.h:60
void recordInput(bool r)
Enables or disables the input data recording, for internal analysis.
Definition: bio.h:152
const Security::TlsDetails::Pointer & receivedHelloDetails() const
Definition: bio.h:171
bool holdWrite_
The write hold state of the bio.
Definition: bio.h:188
bool holdRead_
The read hold state of the bio.
Definition: bio.h:189
bool holdWrite_
The write hold state of the bio.
Definition: bio.h:97
Ssl::BumpMode bumpMode()
return the bumping mode
Definition: bio.h:159
void mode(Ssl::BumpMode m)
The bumping mode.
Definition: bio.h:158
void setClientFeatures(Security::TlsDetails::Pointer const &details, SBuf const &hello)
Sets the random number to use in client SSL HELLO message.
Definition: bio.cc:268
size_t rbufConsumePos
The size of data stored in rbuf which passed to the openSSL.
Definition: bio.h:196
void BIO_set_init(BIO *table, int init)
Definition: bio.h:210
SBuf helloMsg
Used to buffer output data.
Definition: bio.h:183
bool helloBuild
True if the client hello message sent to the server.
Definition: bio.h:185
virtual ~Bio()
Definition: bio.cc:103
CtoCpp1(X509_free, X509 *) typedef Security CtoCpp1(X509_CRL_free, X509_CRL *) typedef Security typedef std::list< Security::CertPointer CertList)
Definition: forward.h:96
bool holdRead() const
The read hold state.
Definition: bio.h:148
virtual int write(const char *buf, int size, BIO *table)
Definition: bio.cc:471
void const char HLPCB void * data
Definition: stub_helper.cc:16
static const time_t RenegotiationsWindow
approximate size of a time window for computing client-initiated renegotiation rate (in seconds) ...
Definition: bio.h:91
bool holdRead_
The read hold state of the bio.
Definition: bio.h:96
int helloSize
The SSL hello message sent by client size.
Definition: bio.h:98
Security::CertList serverCertificates
parsed certificates chain
Definition: Handshake.h:72
Security::HandshakeParser parser_
The TLS/SSL messages parser.
Definition: bio.h:197
virtual int read(char *buf, int size, BIO *table)
Definition: bio.cc:275
int giveBuffered(char *buf, const int size)
Definition: bio.cc:351
Counts events, forgetting old ones. Usefull for "3 errors/minute" limits.
Definition: FadingCounter.h:15
int BIO_get_init(BIO *table)
Definition: bio.h:209
void holdWrite(bool h)
Enables or disables the write hold state.
Definition: bio.h:146
bool gotHello() const
Definition: bio.h:162
bool parseError
error while parsing server hello message
Definition: bio.h:192
BIO source and sink node, handling socket I/O and monitoring SSL state.
Definition: bio.h:30
static const int RenegotiationsLimit
the maximum tolerated number of client-initiated renegotiations in RenegotiationsWindow ...
Definition: bio.h:94
void setReadBufData(SBuf &data)
Definition: bio.h:88
virtual int read(char *buf, int size, BIO *table)
Reads data from socket.
Definition: bio.cc:131
bool parsedHandshake
whether we are done parsing TLS Hello
Definition: bio.h:191
ClientBio(const int anFd)
Definition: bio.cc:171
bool holdWrite() const
The write hold state.
Definition: bio.h:144
void const char * buf
Definition: stub_helper.cc:16
bool allowSplice
True if the SSL stream can be spliced.
Definition: bio.h:186
bool resumingSession()
Definition: bio.cc:556
void BIO_set_data(BIO *table, void *data)
Definition: bio.h:208
void holdRead(bool h)
Enables or disables the read hold state.
Definition: bio.h:150
bool canBump()
Whether we can bump or not the SSL stream.
Definition: bio.h:156
SBuf rbuf
Used to buffer input data.
Definition: bio.h:61
TlsDetails::Pointer details
TLS handshake meta info or nil.
Definition: Handshake.h:70
FadingCounter renegotiations
client requested renegotiations limit control
Definition: bio.h:99
virtual void stateChanged(const SSL *ssl, int where, int ret)
Definition: bio.cc:156
const Security::CertList & serverCertificatesIfAny()
Definition: bio.h:168
virtual void stateChanged(const SSL *ssl, int where, int ret)
Definition: bio.cc:182
SBuf clientSentHello
TLS client hello message, used to adapt our tls Hello message to the server.
Definition: bio.h:182
bool record_
If true the input data recorded to rbuf for internal use.
Definition: bio.h:190
mb_size_t helloMsgSize
Definition: bio.h:184
virtual void flush(BIO *table)
Definition: bio.cc:547
void applyTlsDetailsToSSL(SSL *ssl, Security::TlsDetails::Pointer const &details, Ssl::BumpMode bumpMode)
Definition: bio.cc:686
void hold(bool h)
Prevents or allow writting on socket.
Definition: bio.h:83
int fd() const
The SSL socket descriptor.
Definition: bio.h:46
virtual int read(char *buf, int size, BIO *table)
Definition: bio.cc:220
Bio(const int anFd)
Definition: bio.cc:98
ssize_t mb_size_t
Definition: MemBuf.h:17
bool gotHelloFailed() const
Return true if the Server Hello parsing failed.
Definition: bio.h:165
ServerBio(const int anFd)
Definition: bio.cc:245
void * BIO_get_data(BIO *table)
Definition: bio.h:207
BumpMode
Definition: support.h:125
int readAndBuffer(BIO *table)
Definition: bio.cc:337
int readAndGive(char *buf, const int size, BIO *table)
Read and give everything to OpenSSL.
Definition: bio.cc:285
int readAndParse(char *buf, const int size, BIO *table)
Definition: bio.cc:305
const char * abortReason
why we should terminate the connection during next TLS operation (or nil)
Definition: bio.h:102
virtual void stateChanged(const SSL *ssl, int where, int ret)
The ServerBio version of the Ssl::Bio::stateChanged method.
Definition: bio.cc:262
bool allowBump
True if the SSL stream can be bumped.
Definition: bio.h:187
int size
Definition: ModDevPoll.cc:77

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors