1 /**
2  * Copyright (c) 2017, Andrew Gault, Nick Chadwick and Guillaume Egles.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *    * Redistributions of source code must retain the above copyright
8  *      notice, this list of conditions and the following disclaimer.
9  *    * Redistributions in binary form must reproduce the above copyright
10  *      notice, this list of conditions and the following disclaimer in the
11  *      documentation and/or other materials provided with the distribution.
12  *    * Neither the name of the <organization> nor the
13  *      names of its contributors may be used to endorse or promote products
14  *      derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #pragma once
29 
30 /**
31  * Wrapper around OpenSSL DTLS.
32  */
33 
34 #include "ChunkQueue.hpp"
35 #include "PeerConnection.hpp"
36 #include "Logging.hpp"
37 
38 #include <openssl/ssl.h>
39 
40 #include <thread>
41 
42 namespace rtcdcpp {
43 
44 class DTLSWrapper {
45  public:
46   DTLSWrapper(PeerConnection *peer_connection);
47   virtual ~DTLSWrapper();
48 
certificate()49   const RTCCertificate *certificate() { return certificate_; }
50 
51   bool Initialize();
52   void Start();
53   void Stop();
54 
55   void EncryptData(ChunkPtr chunk);
56   void DecryptData(ChunkPtr chunk);
57 
58   void SetEncryptedCallback(std::function<void(ChunkPtr chunk)>);
59   void SetDecryptedCallback(std::function<void(ChunkPtr chunk)>);
60 
61  private:
62   PeerConnection *peer_connection;
63   const RTCCertificate *certificate_;
64 
65   std::atomic<bool> should_stop;
66 
67   ChunkQueue encrypt_queue;
68   ChunkQueue decrypt_queue;
69 
70   std::thread encrypt_thread;
71   std::thread decrypt_thread;
72 
73   void RunEncrypt();
74   void RunDecrypt();
75 
76   // SSL Context
77   std::mutex ssl_mutex;
78   SSL_CTX *ctx;
79   SSL *ssl;
80   BIO *in_bio, *out_bio;
81 
82   bool handshake_complete;
83 
84   std::function<void(ChunkPtr chunk)> decrypted_callback;
85   std::function<void(ChunkPtr chunk)> encrypted_callback;
86 
87   std::shared_ptr<Logger> logger = GetLogger("rtcdcpp.DTLS");
88 };
89 }
90