123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- var forge = require('./forge');
- require('./tls');
- forge.tls.wrapSocket = function(options) {
-
- var socket = options.socket;
-
- var tlsSocket = {
- id: socket.id,
-
- connected: socket.connected || function(e) {},
- closed: socket.closed || function(e) {},
- data: socket.data || function(e) {},
- error: socket.error || function(e) {}
- };
-
- var c = forge.tls.createConnection({
- server: false,
- sessionId: options.sessionId || null,
- caStore: options.caStore || [],
- sessionCache: options.sessionCache || null,
- cipherSuites: options.cipherSuites || null,
- virtualHost: options.virtualHost,
- verify: options.verify,
- getCertificate: options.getCertificate,
- getPrivateKey: options.getPrivateKey,
- getSignature: options.getSignature,
- deflate: options.deflate,
- inflate: options.inflate,
- connected: function(c) {
-
- if(c.handshakes === 1) {
- tlsSocket.connected({
- id: socket.id,
- type: 'connect',
- bytesAvailable: c.data.length()
- });
- }
- },
- tlsDataReady: function(c) {
-
- return socket.send(c.tlsData.getBytes());
- },
- dataReady: function(c) {
-
- tlsSocket.data({
- id: socket.id,
- type: 'socketData',
- bytesAvailable: c.data.length()
- });
- },
- closed: function(c) {
-
- socket.close();
- },
- error: function(c, e) {
-
- tlsSocket.error({
- id: socket.id,
- type: 'tlsError',
- message: e.message,
- bytesAvailable: 0,
- error: e
- });
- socket.close();
- }
- });
-
- socket.connected = function(e) {
- c.handshake(options.sessionId);
- };
-
- socket.closed = function(e) {
- if(c.open && c.handshaking) {
-
- tlsSocket.error({
- id: socket.id,
- type: 'ioError',
- message: 'Connection closed during handshake.',
- bytesAvailable: 0
- });
- }
- c.close();
-
- tlsSocket.closed({
- id: socket.id,
- type: 'close',
- bytesAvailable: 0
- });
- };
-
- socket.error = function(e) {
-
- tlsSocket.error({
- id: socket.id,
- type: e.type,
- message: e.message,
- bytesAvailable: 0
- });
- c.close();
- };
-
- var _requiredBytes = 0;
- socket.data = function(e) {
-
- if(!c.open) {
- socket.receive(e.bytesAvailable);
- } else {
-
-
- if(e.bytesAvailable >= _requiredBytes) {
- var count = Math.max(e.bytesAvailable, _requiredBytes);
- var data = socket.receive(count);
- if(data !== null) {
- _requiredBytes = c.process(data);
- }
- }
- }
- };
-
- tlsSocket.destroy = function() {
- socket.destroy();
- };
-
- tlsSocket.setSessionCache = function(cache) {
- c.sessionCache = tls.createSessionCache(cache);
- };
-
- tlsSocket.connect = function(options) {
- socket.connect(options);
- };
-
- tlsSocket.close = function() {
- c.close();
- };
-
- tlsSocket.isConnected = function() {
- return c.isConnected && socket.isConnected();
- };
-
- tlsSocket.send = function(bytes) {
- return c.prepare(bytes);
- };
-
- tlsSocket.receive = function(count) {
- return c.data.getBytes(count);
- };
-
- tlsSocket.bytesAvailable = function() {
- return c.data.length();
- };
- return tlsSocket;
- };
|