Robin Seggelmann via RT wrote:
The latest patch was modified to maintain the previous values of new_session 
for legacy applications. We can either break compatibility of a few 
applications, if any, by adding a new field or by adding new values. I don't 
see any possibility to avoid this at all.

What legacy applications require the previous values of new_session to be preserved ? How are those applications able to access new_session without indirecting usage, access and interpretation of new_session via the libssl.so library itself ?

The only user of these field(s) is libssl.so itself. The exact meaning, usage and interpretation of the field(s) is a matter of "implementation detail" which is encapsulated and presented to the application via the document OpenSSL APIs.



Doing:

struct ssl_st *ssl;
ssl = SSL_new();
printf("ssl.foobar=%d\n", ssl->foobar);    /* Read access is illegal */
ssl->foobar = 1;                     /* Write access is illegal */

Illegal on the basis that it is not a documented approach to use the library.



There would be no compatibility issue if you change the meaning of the ssl_st.new_session (if this is a tri-state, then use bit-0 and bit-1 to mean the value it needs).

Move the variable "renegotiate" into bit-2 and bit-3 of ssl_st.new_session to get the tri-state you need.

Then fixup all the code that uses ssl_st.new_session as well as your new code that want a tri-state variable (ssl_st.renegotiate).

#define SSL_B_NEW_SESSION_0     0x00
#define SSL_B_NEW_SESSION_1     0x01
#define SSL_B_NEW_SESSION_2     0x02
#define SSL_M_NEW_SESSION       0x03
#define SSL_SET_NEW_SESSION(s) (((s)->new_session) = (((s)->new_session) & (~SSL_M_NEW_SESSION)) | ((v) & SSL_M_NEW_SESSION)) #define SSL_TEST_EQUAL_NEW_SESSION(s, v) (((s)->new_session) & SSL_M_NEW_SESSION) == (v)) #define SSL_TEST_NOTEQUAL_NEW_SESSION(s, v) (((s)->new_session) & SSL_M_NEW_SESSION) != (v))

ssl->new_session = 0;  /* SSL_SET_NEW_SESSION(ssl, SSL_B_NEW_SESSION_0); */
if(ssl->new_session) {} /* if(SSL_TEST_NOTEQUAL_NEW_SESSION(ssl, SSL_B_NEW_SESSION_0)) { } */ if(!ssl->new_session) {} /* if(SSL_TEST_EQUAL_NEW_SESSION(ssl, SSL_B_NEW_SESSION_0)) { } */ if(ssl->new_session == 2) {} /* if(SSL_TEST_EQUAL_NEW_SESSION(ssl, SSL_B_NEW_SESSION_2)) { } */


#define SSL_B_RENEGOTIATE_0     0x00
#define SSL_B_RENEGOTIATE_1     0x04
#define SSL_B_RENEGOTIATE_2     0x08
#define SSL_M_RENEGOTIATE       0x0c
/* The rest is the same as the NEW_SESSION example s/NEW_SESSION/RENEGOTIATE/ */

Obviously triple check the logic, make it look prettier, there are a few extra paranoid parentesis thrown in for good measure (and to clarify/document precedence intent), also you'd hope the "((v) & SSL_M_NEW_SESSION))" would be optimized out by the compiler due to 2 constants being involved.


Darryl
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to