[PATCH] Add TLS support to Mathopd [Re: Add (alpha) GnuTLS support to Mathopd]

Mr Allwyn Fernandes <[email protected]> Wed, 10 Oct 2007 13:26:05 +1000
Newsgroups gmane.network.mathopd
Organization Stobor Pty Ltd
Message-ID <[email protected]>
--Boundary-00=_NZEDH6aIoKaAlFK
Content-Type: text/plain;
  charset="utf-8"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Hi again,

On Mon, 24 Sep 2007 02:32:13 pm Mr Allwyn Fernandes wrote:
> While I usually hold off on sending in patches until they are complete with
> documentation and fully tested, this one has been a Wishlist item for
> Mathopd for a while, so I thought I'd send it through for anyone to play
> with...
> 
> It is a preliminary patch for TLSv1/SSLv3 support for Mathopd 1.5p6, 

I've updated this patch, and it's somewhat better now:

 * Can now use either GnuTLS or OpenSSL as your TLS library.

 * TLS now works even if *_SENDFILE is defined. Sendfile is used for non-TLS 
sockets, while traditional IO is used for TLS sockets.

 * There's some documentation for the TLS configuration options. See 
config.txt and tls.txt.

OpenSSL support works, and is functional. OpenSSL CRL support is NOT 
implemented, because I can't figure out how to make it work yet. 

GnuTLS support works, and is functional. GnuTLS CRL support is implemented.

Please, please specify a DH Params file if you're doing repeated testing. DH 
params generation at startup can take a long time otherwise... 

Patch: http://opensource.stobor.net/mathopd/tls.1.5p6.diff (or see attached).

As usual, apply using: 

/tmp/mathopd-1.5p6$ gunzip tls.1.5p6.diff.gz | patch -p1

Further details will follow at http://opensource.stobor.net/mathopd/#TLS

As always, if you have any problems, questions or comments, please don't 
hesitate to get back to me.

Cheers,

Allwyn.


-- 
Allwyn Fernandes
Director
Stobor Pty Ltd

Mobile: + 61 430 436 758
LinkedIn: http://www.linkedin.com/in/AllwynFernandes

--Boundary-00=_NZEDH6aIoKaAlFK
Content-Type: application/x-gzip;
  name="tls.1.5p6.diff.gz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
	filename="tls.1.5p6.diff.gz"

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
H1mnlxKLAAA=

--Boundary-00=_NZEDH6aIoKaAlFK--