【转载】令人作呕的OpenSSL,转自CSDN博主Bomb250

原文:http://blog.csdn.net/dog250/article/details/24552307
作者:Bomb250
日期:2014年04月26日 20:00:02

引子

在 OpenSSL 心脏出血之后,我相信很多人都出了血,并且流了泪...网上瞬间出现了大量吐嘈 OpenSSL 的文章或段子,仿佛内心的窝火一瞬间被释放了出来,跟着这场疯闹,我也吐一下嘈,以雪这些年被 OpenSSL 蹂躏之辱,也许可以顺便展现一下我的无知与愚昧...

典型的OpenSSL代码风格

some_function(...)  
{  
    ...  
    if (s->session->sess_cert != NULL)  
        {  
#ifndef OPENSSL_NO_RSA  
        if (s->session->sess_cert->peer_rsa_tmp != NULL)  
            {  
            ...  
            }  
#endif  
        ...  
        }  
    else  
        {  
        ...;  
        }  
    ...  
#ifndef OPENSSL_NO_RSA  
    if (alg & SSL_kRSA)  
        {  
        ...  
        }  
#else /* OPENSSL_NO_RSA */  
    if (0)  
        ;  
#endif  
#ifndef OPENSSL_NO_DH  
    else if (alg & SSL_kEDH)  
        {  
        ...  
#ifndef OPENSSL_NO_RSA  
        if (alg & SSL_aRSA)  
            ...  
#else  
        if (0)  
            ;  
#endif  
#ifndef OPENSSL_NO_DSA  
        else if (alg & SSL_aDSS)  
            ...;  
#endif  
        /* else anonymous DH, so no certificate or pkey. */  
        ...  
        }  
    else if ((alg & SSL_kDHr) || (alg & SSL_kDHd))  
        {  
        ...  
        goto f_err;  
        }  
#endif /* !OPENSSL_NO_DH */  
  
#ifndef OPENSSL_NO_ECDH  
    else if (alg & SSL_kECDHE)  
        {  
        ...  
        if (0) ;  
#ifndef OPENSSL_NO_RSA  
        else if (alg & SSL_aRSA)  
            ...;  
#endif  
#ifndef OPENSSL_NO_ECDSA  
        else if (alg & SSL_aECDSA)  
            ...;  
#endif  
        /* else anonymous ECDH, so no certificate or pkey. */  
        ...  
        }  
    else if (alg & SSL_kECDH)  
        {  
        ...  
        goto f_err;  
        }  
#endif /* !OPENSSL_NO_ECDH */  
    if (alg & SSL_aFZA)  
        {  
        ...  
        goto f_err;  
        }  
  
  
    /* p points to the next byte, there are 'n' bytes left */  
  
    /* if it was signed, check the signature */  
    if (pkey != NULL)  
        {  
        ...  
        if ((i != n) || (n > j) || (n <= 0))  
            {  
            /* wrong packet length */  
            ...  
            goto f_err;  
            }  
  
#ifndef OPENSSL_NO_RSA  
        if (pkey->type == EVP_PKEY_RSA)  
            {  
            ...  
            for (num=2; num > 0; num--)  
                {  
                ...  
                }  
            ...  
            if (i < 0)  
                {  
                ...  
                goto f_err;  
                }  
            if (i == 0)  
                {  
                /* bad signature */  
                ...  
                goto f_err;  
                }  
            }  
        else  
#endif  
#ifndef OPENSSL_NO_DSA  
            if (pkey->type == EVP_PKEY_DSA)  
            {  
            /* lets do DSS */  
            ...  
            if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)  
                {  
                /* bad signature */  
                ...  
                goto f_err;  
                }  
            }  
        else  
#endif  
#ifndef OPENSSL_NO_ECDSA  
            if (pkey->type == EVP_PKEY_EC)  
            {  
            /* let's do ECDSA */  
            ...  
            if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)  
                {  
                /* bad signature */  
                ...  
                goto f_err;  
                }  
            }  
        else  
#endif  
            {  
            ...  
            goto err;  
            }  
        }  
    else  
        {  
        /* still data left over */  
        if (!(alg & SSL_aNULL))  
            {  
            ...  
            goto err;  
            }  
        if (n != 0)  
            {  
            ...  
            goto f_err;  
            }  
        }  
    ...  
    return(1);  
f_err:  
    ...;  
err:  
    ...;  
#ifndef OPENSSL_NO_RSA  
    if (rsa != NULL)  
        RSA_free(rsa);  
#endif  
#ifndef OPENSSL_NO_DH  
    if (dh != NULL)  
        DH_free(dh);  
#endif  
#ifndef OPENSSL_NO_ECDH  
    ...;  
    if (ecdh != NULL)  
        EC_KEY_free(ecdh);  
#endif  
    ...;  
    return(-1);  
}

你可能感兴趣的:(【转载】令人作呕的OpenSSL,转自CSDN博主Bomb250)