On Tue, Jan 23, 2007 at 12:15:49AM -0500, Victor Duchovni wrote:

[ Issues explained more concisely, any comments from the OpenSSL team? ]

>     > STARTTLS
>     < 220 2.0.0 Ready to start TLS
>     SSL_connect error to localhost[127.0.0.1]:26: -1
>     warning: TLS library problem: 27116:error:140D308A:SSL 
> routines:TLS1_SETUP_KEY_BLOCK:cipher or hash 
> unavailable:../../../../common/openssl/ssl/t1_enc.c:449:
> 
> The problem is lack of AES256 support the stock SunOS 5.10 libcrypto. They
> only partly fixed the problem by changing the definition of the "DEFAULT"
> cipherlist as follows:

Sun builds libcrypto with AES128 support, but without AES256 support.

>     $ strings /usr/sfw/lib/libssl.so | grep ':@STRENGTH' | uniq
>     
> ALL:!DHE-RSA-AES256-SHA:!DHE-DSS-AES256-SHA:!AES256-SHA:!ADH:+RC4:@STRENGTH

And attempts to paper-over the problem with a custom "DEFAULT" cipherlist,
(but COMPLEMENTOFDEFAULT is wrong, and "ALL" and "HIGH" are not usable).

When "ALL" is used instead of "DEFAULT", libssl believes that AES256 is
present because AES128 is present:

    ssl_cipher_get_disabled():

        mask |= (ssl_cipher_methods[SSL_ENC_AES128_IDX] == NULL) ? SSL_AES:0;

there is no separate probe for AES256, and no dedicated mask bit to tell
the two apart.

So Postfix now manually adds exceptions to the "ALL" cipherlist by
probing for AES256 and appending "!AES+HIGH" when AES256 is not found.
Code to augment the cipher exclusion array with "AES+HIGH" below:

>     typedef struct {
>       char *algorithm;
>       char *exclusion;
>     } cipher_probe;
> 
>     static cipher_probe cipher_probe_list[] = {
>       /* Check for missing AES256 */
>       SN_aes_256_cbc,         SSL_TXT_AES "+HIGH",
>       0,                      0,
>     };
> 
>     ARGV *unavailable_ciphers()
>     {
>       ARGV *exclude = 0;
>       cipher_probe *probe;
> 
>       for (probe = cipher_probe_list; probe->algorithm; ++probe)
>           if (!EVP_get_cipherbyname(probe->algorithm))
>               argv_add(exclude ? exclude : (exclude = argv_alloc(1)),
>                        probe->exclusion);
>       return exclude;
>     }

This addresses (somewhat crudely because it also clobbers AES128 which
is considered "HIGH" by 0.9.7l and 0.9.7d) the immediate issue:

    $ openssl ciphers -v 'AES+HIGH'
    ADH-AES256-SHA          SSLv3 Kx=DH       Au=None Enc=AES(256)  Mac=SHA1
    DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
    DHE-DSS-AES256-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA1
    AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
    ADH-AES128-SHA          SSLv3 Kx=DH       Au=None Enc=AES(128)  Mac=SHA1
    DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
    DHE-DSS-AES128-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA1
    AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1

but I would like to find out whether this problem:

    - is likely to be resolved for AES256 in future OpenSSL releases
    (by separately testing for disabled AES256 and AES128, and not mixing
    AES128 in with the "HIGH" ciphers).

    - is not likely to be repeated with other ciphers in future OpenSSL
    releases (by ensuring that ssl_cipher_get_disabled() is not "fuzzy"
    and masks out all symmetric ciphers that are not available).

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

Reply via email to