
  OpenSSL STATUS                           Last modified at
  ______________                           $Date: 1999/03/09 03:01:42 $

  DEVELOPMENT STATE

    o  OpenSSL 0.9.2: Freezed!
       - No more feature commits, please. 
       - Commit bugfixes and cleanups only, please.
       - Already successfully tested platform:
	 o  FreeBSD 2.2.7  Ben Laurie            OK
         o  FreeBSD 3.1    Ralf S. Engelschall   all silent
         o  Solaris 2.6    Ralf S. Engelschall   ctype-related warnings, test fails
	 o  Linux RH 5.1   Steve Henson		 OK

       Proposed release time: Monday, March 15th 1999

    o  OpenSSL 0.9.1c: Released on December 23th, 1998

  RELEASE SHOWSTOPPERS

  AVAILABLE PATCHES

    o Solaris AS error (kenji@miyake.org)
    o getenv in ca.c and x509_def.c (jaltman@watsun.cc.columbia.edu)
    o s3_lib.c - export clients (levitte@stacken.kth.se)
    o linux dynamic libs (colin@field.medicine.adelaide.edu.au)
    o MingW support (niklas@canit.se)
    o crypto/des/enc_read.c bugfix (mike@cs.mun.ca)

  IN PROGRESS

    o Steve is currently working on:
        X509 V3 extension code including:
        1. Support for the more common PKIX extensions.
        2. Proper (or at least usable) certificate chain verification.
        3. Support in standard applications (req, x509, ca).
        4. Documentation on how all the above works.
        Next on the list is probably PKCS#12 integration.

    o Mark is currently working on:
        Folding in any changes that are in the C2Net code base that were
        not in the original SSLeay-0.9.1.b release.  Plus other minor
        tidying.

    o Ralf is currently working on:
        1. Support for SSL_set_default_verify_paths(),
           SSL_load_verify_locations(), SSL_get_cert_store() and
           SSL_set_cert_store() functions which work like their existing
           SSL_CTX_xxx() variants but on a per connection basis. That's needed
           to let us provide full-featured per-URL client verification in
           mod_ssl or Apache-SSL.
           => It still dumps core, so I suspend this and investigate
              again for OpenSSL 0.9.3.
        2. The perl/ stuff to make it really work the first time ;-)
           => I'll investigate a few more hours for OpenSSL 0.9.2
        3. The new documentation set in POD format under doc/
           => I'll investigate a few more hours for OpenSSL 0.9.2
        4. More cleanups to get rid of obsolete/old/ugly files in the
           source tree which are not really needed.
           => Done all which were possible with my personal knowledge

    o Ben is currently working on:
	1. Function Prototype Thought Police issues.
	2. Integrated documentation.
	3. New TLS Ciphersuites.
	4. Anything else that takes his fancy.

  NEEDS PATCH

  OPEN ISSUES

    o  The Makefile hierarchy and build mechanism is still not a round thing:

       1. The config vs. Configure scripts
          It's the same nasty situation as for Apache with APACI vs.
          src/Configure. It confuses.
          Suggestion: Merge Configure and config into a single configure
                      script with a Autoconf style interface ;-) and remove
                      Configure and config. Or even let us use GNU Autoconf
                      itself. Then we can avoid a lot of those platform checks
                      which are currently in Configure.

       2. The xxx.org -> xxx.h generation:
          It's not obvious for which file xxx.org is the source.
          Suggestion: Rename xxx.org to xxx.h.in (Autoconf style), this way
                      one sees that xxx.h.in is the input for xxx.h

          Status: Mark +1

    o  The installation under "make install" produces a very
       installation layout: $prefix/certs and $prefix/private dirs.  That's
       not nice. Ralf suggests to move the two certs and private dirs either
       to $prefix/etc/, $prefix/lib/ or $prefix/share. Alternatively
       we could also not install the certs at all.

       Status: Ralf +1 for both not installing the certs at all and
                       moving it to $prefix/etc/. +0 for $prefix/lib/
                       and $prefix/share.
               Paul: why is it not nice?
               Ralf: because it messes up the install dir when
                     $prefix is not a dedicated area like /usr/local/ssl.
                     When we move them to a standard subdir like
                     etc/ lib/ or share/ we don't mess up things
                     when $prefix is /usr or /usr/local, etc.
                     Additionally it makes package vendors life
                     easier....

    o  Support for Shared Libraries has to be added at least
       for the major Unix platforms. The details we can rip from the stuff
       Ralf has done for the Apache src/Configure script. Ben wants the
       solution to be really simple.

       Status: Ralf will look how we can easily incorporate the
               compiler PIC and linker DSO flags from Apache
               into the OpenSSL Configure script.

    o  The perl/ stuff needs a major overhaul. Currently it's
       totally obsolete. Either we clean it up and enhance it to be up-to-date
       with the C code or we also could replace it with the really nice
       Net::SSLeay package we can find under
       http://www.neuronio.pt/SSLeay.pm.html.  Ralf uses this package for a
       longer time and it works fine and is a nice Perl module. Best would be
       to convince the author to work for the OpenSSL project and create a
       Net::OpenSSL or Crypt::OpenSSL package out of it and maintains it for
       us.

       Status: Ralf thinks we should both contact the author of Net::SSLeay
               and look how much effort it is to bring Eric's perl/ stuff up
               to date.
               Paul +1

    o The EVP and ASN1 stuff is a mess. Currently you have one EVP_CIPHER
      structure for each cipher. This may make sense for things like DES but
      for variable length ciphers like RC2 and RC4 it is NBG. Need a way to
      use the EVP interface and set up the cipher parameters. The ASN1 stuff
      is also foo wrt ciphers whose AlgorithmIdentifier has more than just
      an IV in it (e.g. RC2, RC5). This also means that EVP_Seal and EVP_Open
      don't work unless the key length matches the fixed value (some vendors
      use a key length decided by the size of the RSA encrypted key and expect
      RC2 to adapt).

    o Properly initialize the PRNG in the absence of /dev/random.

    o > NO_RSA (ejs@bfd.com)
      > ./Configure -DNO_IDEA -DNO_RC5 -DNO_RC4 -DNO_RC2 -DNO_RSA -DNO_ERR linux-elf
      > I tried for a whole day to do this and could not get it to work.  Linux
      > machine, kernel 2.0.36 and 2.2.1, redhat 5.2 latest, gcc and egcs , no
      > go.  I also noticed the even with -DNO_IDEA, _DNO_RC2, etc. the make
      > still goes into those subdirectories and 'makes'.

  WISHES

    o  Damien Miller:
       "How about making the each of the locations compile-time defined. I
       would like to (for example) put binaries in /usr/bin, configuration
       data, certs and keys in /etc/openssl/certs and /etc/openssl/keys, etc.
       This would also be a great boon to binary package makers.  The
       SSLeay-0.9.1b RPM already includes some patches which do some of this.
       I can forward them if you wish."

    o  Mats Nilsson <mats.nilsson@xware.se>:
       "Add reference counting to all substructures of X509 etc. For instance,
       X509_NAME lacks a reference counter, while EVP_PKEY has one.  I'm
       making COM-wrappers for selected parts of SSLeay for a project of ours,
       and has found this inconsistency in copy semantics annoying."

