forgot to mention - (it was too late in the evening yesterday) - this was
found in 
openssl-0.9.5a, file crypto/evp/bio_b64.c, function static int b64_write(BIO
*b, char *in, int inl)

Today I prepared a build of OpenSSL with my changes and tested it. Seems to
work fine. The changes are marked with *** in the snippet below

At the end of the message you'll find a description of how the proposed fix
was tested

=================================

--------------------------
original code
--------------------------
                if (BIO_get_flags(b) & BIO_FLAGS_BASE64_NO_NL)
                        {
                        if (ctx->tmp_len > 0)
                                {
                                n=3-ctx->tmp_len;
                                memcpy(&(ctx->tmp[ctx->tmp_len]),in,n);
                                ctx->tmp_len+=n;
                                n=ctx->tmp_len;
                                if (n < 3)
                                        break;
                                ctx->buf_len=EVP_EncodeBlock(
                                        (unsigned char *)ctx->buf,
                                        (unsigned char *)ctx->tmp,n);
                                }

------------------------------
new code:
------------------------------

                if (BIO_get_flags(b) & BIO_FLAGS_BASE64_NO_NL)
                        {
                        if (ctx->tmp_len > 0)
                                {
                                n=3-ctx->tmp_len;
                                memcpy(&(ctx->tmp[ctx->tmp_len]),in,n);
                                ctx->tmp_len+=n;
                                /* n=ctx->tmp_len; removed statement *** */
                                /* if (n < 3)
***
                                        break;         removed statement ***
*/

                                /* you could do (ctx->tmp_len < 3 ) check
instead of the removed one here */

                                ctx->buf_len=EVP_EncodeBlock(
                                        (unsigned char *)ctx->buf,
                                        (unsigned char *)ctx->tmp, /* n
replaecd parameter *** */ ctx->tmp_len );
                    
                                ctx->tmp_len=0; /* added statement  *** */
                                }

=================================


TEST description - enc_base64 and dec_base64 create mem bios with attached
base64 filter bios
dec_64 mem bio returns 0 on EOF (BIO_set_mem_eof_return(b,0) was set).
base64 filter bios have 
BIO_set_flags ( b64, BIO_FLAGS_BASE64_NO_NL); flags set.

for every iteration of the loop the length of the string encoded and decoded
increases by 1 until it reaches 
the original length of the array. The original string was encoded than the
encoded result was decoded and compared with the original.

As a result somewhere around 1800 iterations were done and it worked fine.

==================
{
   char array[]=<array containing about 2 KBytes containing some test
phrases>

    for( int j = 1; j < array_len; j++)
    {
        c = array[j];
        array[j]='\0';

        cb = enc_base64( ain, &outenc);
    
        cb = dec_base64( outenc, &outdec);

        if( strcmp( array, outdec) != 0)
            _ASSERT(0);

        array[j]=c;

        if( outenc) 
            Free( outenc);
    
        if( outdec) 
            Free( outdec);
    }
}
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to