On Tue, Dec 14, 2010 at 09:52:58AM -0500, Kenneth Goldman wrote:

> Question:
> 
> OPENSSL_VERSION_TEXT is undocumented.  Can I count on it being there and 
> up to date, or is it for internal use only?
> 
> Request:
> 
> OPENSSL_VERSION_NUMBER varies between a long and an int constant,  Could 
> it please be standardized?

It is standardized, but the standard has changed as OpenSSL evolved, it
is quite stable now. Postfix parses the number explained as follows:

    /*
     * OPENSSL_VERSION_NUMBER(3):
     *
     * OPENSSL_VERSION_NUMBER is a numeric release version identifier:
     *
     * MMNNFFPPS: major minor fix patch status
     *
     * The status nibble has one of the values 0 for development, 1 to e for
     * betas 1 to 14, and f for release. Parsed OpenSSL version number. for
     * example
     *
     * 0x000906000 == 0.9.6 dev 0x000906023 == 0.9.6b beta 3 0x00090605f ==
     * 0.9.6e release
     *
     * Versions prior to 0.9.3 have identifiers < 0x0930.  Versions between
     * 0.9.3 and 0.9.5 had a version identifier with this interpretation:
     *
     * MMNNFFRBB major minor fix final beta/patch
     *
     * for example
     *
     * 0x000904100 == 0.9.4 release 0x000905000 == 0.9.5 dev
     *
     * Version 0.9.5a had an interim interpretation that is like the current
     * one, except the patch level got the highest bit set, to keep continu-
     * ity.  The number was therefore 0x0090581f.
     */

The parser is:

    long version = OPENSSL_VERSION_NUMBER; /* SSLeay() for run-time version */

    if (version < 0x0930) {
        info->status = 0;
        info->patch = version & 0x0f;
        version >>= 4;
        info->micro = version & 0x0f;
        version >>= 4;
        info->minor = version & 0x0f;
        version >>= 4;
        info->major = version & 0x0f;
    } else if (version < 0x00905800L) {
        info->patch = version & 0xff;
        version >>= 8;
        info->status = version & 0xf;
        version >>= 4;
        info->micro = version & 0xff;
        version >>= 8;
        info->minor = version & 0xff;
        version >>= 8;
        info->major = version & 0xff;
    } else {
        info->status = version & 0xf;
        version >>= 4;
        info->patch = version & 0xff;
        version >>= 8;
        info->micro = version & 0xff;
        version >>= 8;
        info->minor = version & 0xff;
        version >>= 8;
        info->major = version & 0xff;
        if (version < 0x00906000L)
            info->patch &= ~0x80;
    }

-- 
        Viktor.
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to