The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Revision history for Perl extension Crypt::MatrixSSL.

0.01  Mon Jan 17 21:59:03 2005
	- original version; created by h2xs 1.23 with options
		--compat-version=5.6.0 -A -n Crypt::MatrixSSL

0.02  Wed Feb 02 23:03:00 2005
	- Corrected Makefile.PL to compile cleanly on Win32, Linux, and Macintosh - with generous help from Randy Kobes
	- cleaned up the testing script
	- included a sample script "mxgg.pl" which demonstrates getting data from an SSL web server
	- fixed some documentation

0.03  Thu Feb 03 15:42:00 2005
	- Fixed the POD doc in MatrixSSL.pm to remove some commented-out code.
	- included the (accidentally omitted in 0.02) source from "matrixssl-1-2-2.zip"

0.04  Fri Feb  4 12:35:58 GMT 2005
	- Some Win32 VC installs failed to compile without a define
	- Some Linux installs failed to test without a library
	- My Windows PC destroyed the CaSe of some important files during "make dist"

0.05  Mon Mar 28 01:50:13 GMT 2005
	- Updated to use matrixssl-1-2-4
	- Scripted the header-file-adjustents so Win32 compilations properly "inline" future releases too

0.06  Fri Apr 22 18:24:58 GMT 2005
	- Updated to use matrixssl-1-2-5

0.07  Wed May  4 23:28:55 GMT 2005
	- Added matrixSslReadKeysMem (previously overlooked due to scarce documentation)

1.73  Mon Feb 27 15:07:38 GMT 2006
	- Update to support MatrixSSL 1.7.3
	- Picked a new version number to match the new underlying MatrixSSL version number
	- Updated matrixSslReadKeysMem API change (itextPass is now unused)
	- added changes suggested by Alex Efros to mxgg.pl 
	- added online testing (grabs https://www.google.com/)

1.8   Fri Apr 7 10:04:57 GMT 2006
	- Update to support MatrixSSL 1.8
	- Improved the perl client SSL socket handshaking in the examples
	- Did a mini-benchmark: MatrixSSL managed:-
		- 200 complete SSL connections per second
		- 7500 SSL transactions per second (on established SSL sockets)
		- Server=Dual 2.66ghz Xeon Fedora4, Client=Dual 2.2ghz Xeon RedHat ES3, Max CPU Utilisation was 50%

1.82  Sat Oct 28 14:10:11 GMT 2006
        - Update to support MatrixSSL 1.82
	- Included the following contributions from Alex Efros:-


	01-online_test.patch:
	* Refactored file name 't/online.enabled' into var.
	* Moved unlink() to 'touch' logic to have everything related to this task
	  in single place.
	* Delete no-op:
	    unless (defined $online_tests) {
	* Replace global $online_tests with lexical.
	* Removed needless '? 1 : 0' to have this line fit in 80 columns.
	* Replaced global filehandle ENABLED with lexical $tmp.
	* Replaced '|| die' with 'or die' which is generally more safe.


	02-mxin_mxout_bugfix.patch:
	* Typo fix.


	03-mxfiles.patch:
	* Added autogeneration of list with MatrixSSL object files to simplify
	  upgrade to new MatrixSSL version (Linux only!).
	* Old version of object files list for MatrixSSL 1-1-5 and 1-7-3 moved
	  to separate files (probably they should be deleted?).


	04-headers.patch:
	* Updated matrixssl_win32_inline.
	  Original code was written for MatrixSSL-1.2.5 which has single .h file:
	  matrixSsl.h. Starting from version 1.7.3 MatrixSSL split matrixSsl.h into
	  two files: matrixSsl.h and matrixCommon.h. Part of code which
	  matrixssl_win32_inline fixes was left in matrixSsl.h, but another part of
	  code was moved into matrixCommon.h.
	  Also '#define SSLPUBLIC' was renamed to '#define MATRIXPUBLIC'.
	  I've updated it to process both .h-files, and #include both .h-files in .xs.
	* Rewrite matrixssl_win32_inline documentation.
	* Deleted mxSsl.h.


	05-xs_no_pod.patch:
	* Deleted all POD from .xs because:
	  - this documentation out of date;
	  - it isn't good place for such documentation in .xs;
	  - I don't think we need duplicate of official .pdf in POD.


	06-MAX_CHAIN_LENGTH.patch:
	* Increase MAX_CHAIN_LENGTH constant to allow usage of big package with
	  root CA certificates (about 120 certificates).


	07-export_const.patch:
	* All hardcoded constants replaced by real constants from .h-files, both
	  in .pm and .xs!
	* All MatrixSSL functions exported into user's package.
	* All constants from .h-files wrapped in .xs into functions and then
	  exported into read-only scalars into user's package in .pm.
	  Constant names are equal to MatrixSSL original names, i.e. without
	  prefix "mx".
	* Hash %mxSSL_ALERT_CODES replaced by two hashes %SSL_alertLevel and
	  %SSL_alertDescription and these hashes also exported into user's package;
	  constant 67/SSL_ALLOW_ANON_CONNECTION removed from hashes.
	* Exporter module replaced by custom import() function in .pm (because
	  Exporter is bloated, ugly, unable to export read-only scalars and it's
	  main feature "tags" isn't needed in this module).
	* Line
	    if(flags!=0) {flags=SSL_FLAGS_SERVER;sessionId=0;}
	  deleted from matrixSslNewSession() in .xs. It's user responsibility to use
	  constant $SSL_FLAGS_SERVER and set $sessionId to 0.
	* Added standard test: t/00.load.t
	* Added test: t/export.t
	* Added test: t/export-const.t
	* Fixed test: t/Crypt-MatrixSSL.t to take advantage from exporting
	  functions and constants.


	08-export_const2.patch:
	* Refactored constants added in 07-export_const.patch using ExtUtils::Constant.


	09-xs_cleanup.patch:
	* Small documentation typo fix in Makefile.PL.
	* Export new constant SSL_MAX_PLAINTEXT_LEN because user need to know
	  maximum length of message in matrixSslEncode() to split his huge
	  message into many matrixSslEncode() calls and avoid SSL_ERROR/SSL_FULL.
	* Now all public MatrixSSL functions supported - added these:
	    matrixSslGetAnonStatus
	    matrixSslAssignNewKeys
	    matrixSslSetResumptionFlag
	    matrixSslGetResumptionFlag
	* INCOMPATIBLE API CHANGES! Removed 'privPass' param from matrixSslReadKeysMem()
	  to have it interface compatible with MatrixSSL documentation.
	* Added typemap to have perl support for MatrixSSL types ssl_t,
	  sslKeys_t and sslSessionId_t. This make possible for perl/xsubpp to
	  automatically generate _correct_ XS code for most functions without
	  manual CODE: and OUTPUT: sections.
	* Delete CODE: and/or OUTPUT: sections for all functions which can be
	  automatically generated now.
	* Renamed all function params to names used in MatrixSSL documentation:
	    mxin    -> in
	    mxout   -> out
	    mxkeys  -> keys
	    session -> ssl
	    etc...
	* Moved var declarations from CODE: to INIT: sections for ease reading.
	* Functions order in .xs slightly changed to correspond with their order
	  in MatrixSSL .pdf documentation - to ease comparing .xs and .pdf.
	* Added new tests.
	=========================
	=== Unobvious changes ===
	=========================
	* Replaced hardcoded constants 18500 and 4100 for 'out' buffer size in
	  matrixSslDecode() and matrixSslEncode*() functions to SSL_MAX_BUF_SIZE.
	    >>> Probably SSL_MAX_RECORD_LEN should be used instead, but I'm not sure,
	    >>> so I take SSL_MAX_BUF_SIZE which is 5 bytes larger...
	* Use static 'out' buffer in matrixSslDecode() and matrixSslEncode*()
	  instead of dirty sv_setpvn/SvCUR_set/SvGROW hacks on SV*.
	* Removed all SvGROW() - AFAIK it isn't required and sv_{set,cat}pv*()
	  will automatically grow SV* if needed.
	* Replaced sv_setpvn() with sv_setpvn_mg() to support more perl magic.
	    >>> I'm not sure, but I suppose this required for things like
	    >>> Data::Alias which often used in proxy applications with in/out
	    >>> buffers.
	* INCOMPATIBLE CHANGES! Now matrixSslDecode() and matrixSslEncode*()
	  functions will APPEND data into output buffer SV* instead of replacing it.
	  This has sense for applications which use single output buffer both
	  for sending data into socket and these functions.
	* matrixSslReadKeys:
	    * Changed params type from SV* to char*.
	    * Removed logic which replace empty string with NULL.
	* matrixSslReadKeysMem:
	    * Removed logic which replace empty string with NULL.
	* matrixSslFreeKeys:
	    * Do not set 'keys' param to 0 after calling matrixSslFreeKeys().
	* matrixSslDeleteSession:
	    * Do not set 'ssl' param to 0 after calling matrixSslDeleteSession().
	* matrixSslDecode:
	    * Changed 'error', 'alertLevel' and 'alertDescription' params type
	      from SV* to unsigned char*.
	    * Removed logic which initialize 'error', 'alertLevel' and
	      'alertDescription' to 0 before calling matrixSslDecode().
	    * Bugfix: 'error', 'alertLevel' and 'alertDescription' was incorrectly
	      set as _signed_ values using sv_setiv() which them all _unsigned_.
	    * Removed logic which silently "define" output SV*.
	* matrixSslEncode:
	    * Removed dirty hack which "define" input buffer because SvPV() will
	      make empty string from undef() automatically plus print warning.
	    * Removed logic which silently "define" output SV*.
	* matrixSslSetSessionOption:
	    * Removed logic which forced 'arg' to NULL because it was needed
	      only as workaround wrong 'arg' type char* (which magically convert
	      undef to empty string and print warning).
	* matrixSslSetCertValidator:
	    * Bugfix: 'arg' type was int instead of void*.

	About these changes. I sure it's good idea to do minimum operations in XS
	level (unless XS used for rewriting some slow perl code in C, of course).
	Library wrappers like Crypt::MatrixSSL should stick to original library
	interface where possible - it somebody wanna make C library interface more
	'cool and perlish' then it's much ease to do this in perl-level wrappers
	in optional Crypt/MatrixSSL/Easy.pm module. With this patch only
	difference from original MatrixSSL interface is in/out buffers in
	matrixSslEncode*() and matrixSslDecode() functions - everything else work
	exactly as described in MatrixSSL .pdf documentation.

	1) Removed logic which replace empty string with NULL.
	    >>> I've fixed XS so it will convert perl undef() into NULL and leave
	    >>> defined strings as-is, i.e. empty perl string will be empty C string.
	    >>> This happens not everythere, but only with params which CAN BE
	    >>> NULL, according to MatrixSSL documentation. If user send undef()
	    >>> as some other param, then he probably will see 'undefined' warning.
	2) Do not set 'XXX' param to 0 after calling matrixSsl{Free,Delete}XXX().
	    >>> This changes original MatrixSSL interface and I don't see any
	    >>> reason why this 'feature' needed.
	3) Removed logic which initialize 'error', 'alertLevel' and
	   'alertDescription' to 0 before calling matrixSslDecode().
	    >>> To avoid senseless 'undefined' warning I convert undefined values
	    >>> in these params into number 0, but if these params already defined
	    >>> numbers they will not be touched. If MatrixSSL doesn't initialize
	    >>> them, then this IS the MatrixSSL's interface!
	4) Removed logic which silently "define" input/output SV* buffers.
	    >>> This is sort of 'always use strict/warnings' idea. User shouldn't
	    >>> use undefined input/output buffers, and if he using them then he
	    >>> will see 'undefined' warnings, which is GOOD THING.

	Added certificates which I've created for new tests


	10-callback.patch:
	* Added constant $SSL_ALLOW_ANON_CONNECTION.
	* Added support for certificate validation callback:
	    matrixSslSetCertValidator($ssl, \&cb, $cb_arg);
	    sub cb {
	        my ($certInfo, $cb_arg) = @_;
	        if ($certInfo->[0]{subject}{commonName} ne 'localhost') {
	            return -1;                          # REJECT certificate
	        }
	        elsif ($certInfo->[0]{validate} == 1) {
	            return 0;                           # ACCEPT certificate
	        }
	        else {
	            return $SSL_ALLOW_ANON_CONNECTION;  # ACCEPT anon certificate
	        }
	    }


	11-doc.patch:
	* POD documentation in .pm added to complete MatrixSSL documentation
	  (differences between original C interface and current Perl interface).
	* Sample client&server scripts added.
	* Minor fix in XS.
	* MANIFEST updated to include all new files.


	12-matrixssl_memleak.patch:
	* Added patch for MatrixSSL which fix significant memory leak in loading
	  certificates with unsupported extentions.


1.83  Sun Apr 1 03:31:17 UTC 2007
        - Update to support MatrixSSL 1.83
	- Tested: builds OK on Linux (RedHat ES3), Mac (OS/X), and Windows (Vista)

1.86  Tue Jan  6 03:50:06 UTC 2009
        - Update to support MatrixSSL 1.8.6
	- Removed SubjectAltName checking from appCertValidator (MatrixSSL 1.8.6 altered this functionality)
	- added ca-certificates.crt (Sample bundle of current CA certs in common browsers)
	- Added this code to detect the process memory usage under Mac OS/X, Linux, and Windows:
		return(`ps -o'rss' -p $$` =~ /(\d+)/) if($^O=~/(^darwin$)/);        # Mac OS/X
		if($^O=~/Win32/i) { my($m)=`tasklist /nh /fi "PID eq $$"` =~/.*\s([\d,]+)/; $m=~tr/,//d; return $m;}        # MSWin32
		return (Cat('/proc/self/status') =~ /VmRSS:\s*(\d*)/)[0];           # Linux
	- Included Crypt-MatrixSSL.ppd and a precompiled Win32 .dll in ../blib/ for PPM (windows users without C/C++ compilers)
	- Tested: builds OK on Linux (RedHat AS4 + SUSE 10.3), Mac (OS/X darwin), and Windows (XP+VC6. Vista+VS.NET complies and runs, but the tests can't find the dll it just built - not sure why)