Changeset 7770


Ignore:
Timestamp:
Jan 22, 2009, 2:32:29 PM (12 years ago)
Author:
charles
Message:

(trunk libT) #1734: encrypted peers' outgoing RC4 stream can be corrupted by sending protocol messages out-of-order

Location:
trunk/libtransmission
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/handshake.c

    r7710 r7770  
    457457        uint8_t vc[VC_LENGTH] = { 0, 0, 0, 0, 0, 0, 0, 0 };
    458458
     459        tr_peerIoWriteBuf( handshake->io, outbuf, FALSE );
    459460        tr_cryptoEncryptInit( handshake->crypto );
    460461        tr_peerIoSetEncryption( handshake->io, PEER_ENCRYPTION_RC4 );
     
    953954    /* maybe de-encrypt our connection */
    954955    if( crypto_select == CRYPTO_PROVIDE_PLAINTEXT )
     956    {
     957        tr_peerIoWriteBuf( handshake->io, outbuf, FALSE );
    955958        tr_peerIoSetEncryption( handshake->io, PEER_ENCRYPTION_NONE );
     959    }
    956960
    957961    dbgmsg( handshake, "sending handshake" );
     
    11751179    tr_peerIoRef( io ); /* balanced by the unref in tr_handshakeFree */
    11761180    tr_peerIoSetIOFuncs( handshake->io, canRead, NULL, gotError, handshake );
     1181    tr_peerIoSetEncryption( io, PEER_ENCRYPTION_NONE );
    11771182
    11781183    if( tr_peerIoIsIncoming( handshake->io ) )
  • trunk/libtransmission/peer-io.c

    r7760 r7770  
    650650void
    651651tr_peerIoWrite( tr_peerIo   * io,
    652                 const void  * writeme,
    653                 size_t        writemeLen,
    654                 int           isPieceData )
     652                const void  * bytes,
     653                size_t        byteCount,
     654                tr_bool       isPieceData )
    655655{
    656656    struct tr_datatype * datatype;
    657657
    658658    assert( tr_amInEventThread( io->session ) );
    659     dbgmsg( io, "adding %zu bytes into io->output", writemeLen );
     659    dbgmsg( io, "adding %zu bytes into io->output", byteCount );
    660660
    661661    datatype = tr_new( struct tr_datatype, 1 );
    662662    datatype->isPieceData = isPieceData != 0;
    663     datatype->length = writemeLen;
     663    datatype->length = byteCount;
    664664
    665665    __tr_list_init( &datatype->head );
    666666    __tr_list_append( &io->outbuf_datatypes, &datatype->head );
    667667
    668     evbuffer_add( io->outbuf, writeme, writemeLen );
    669 }
    670 
    671 void
    672 tr_peerIoWriteBuf( tr_peerIo         * io,
    673                    struct evbuffer   * buf,
    674                    int                 isPieceData )
    675 {
    676     const size_t n = EVBUFFER_LENGTH( buf );
    677     tr_peerIoWrite( io, EVBUFFER_DATA( buf ), n, isPieceData );
    678     evbuffer_drain( buf, n );
    679 }
    680 
    681 /**
    682 ***
    683 **/
    684 
    685 void
    686 tr_peerIoWriteBytes( tr_peerIo       * io,
    687                      struct evbuffer * outbuf,
    688                      const void      * bytes,
    689                      size_t            byteCount )
    690 {
    691     uint8_t tmp[MAX_STACK_ARRAY_SIZE];
    692 
    693668    switch( io->encryptionMode )
    694669    {
    695         case PEER_ENCRYPTION_NONE:
    696             evbuffer_add( outbuf, bytes, byteCount );
    697             break;
    698 
    699         case PEER_ENCRYPTION_RC4: {
     670        case PEER_ENCRYPTION_RC4:
     671        {
     672            uint8_t tmp[MAX_STACK_ARRAY_SIZE];
    700673            const uint8_t * walk = bytes;
    701             evbuffer_expand( outbuf, byteCount );
    702             while( byteCount > 0 ) {
     674            evbuffer_expand( io->outbuf, byteCount );
     675            while( byteCount > 0 )
     676            {
    703677                const size_t thisPass = MIN( byteCount, sizeof( tmp ) );
    704678                tr_cryptoEncrypt( io->crypto, thisPass, walk, tmp );
    705                 evbuffer_add( outbuf, tmp, thisPass );
     679                evbuffer_add( io->outbuf, tmp, thisPass );
    706680                walk += thisPass;
    707681                byteCount -= thisPass;
     
    710684        }
    711685
     686        case PEER_ENCRYPTION_NONE:
     687            evbuffer_add( io->outbuf, bytes, byteCount );
     688            break;
     689
    712690        default:
    713691            assert( 0 );
    714     }
     692            break;
     693    }
     694}
     695
     696void
     697tr_peerIoWriteBuf( tr_peerIo         * io,
     698                   struct evbuffer   * buf,
     699                   tr_bool             isPieceData )
     700{
     701    const size_t n = EVBUFFER_LENGTH( buf );
     702    tr_peerIoWrite( io, EVBUFFER_DATA( buf ), n, isPieceData );
     703    evbuffer_drain( buf, n );
    715704}
    716705
  • trunk/libtransmission/peer-io.h

    r7748 r7770  
    225225                                  const void        * writeme,
    226226                                  size_t              writemeLen,
    227                                   int                 isPieceData );
     227                                  tr_bool             isPieceData );
    228228
    229229void    tr_peerIoWriteBuf       ( tr_peerIo         * io,
    230230                                  struct evbuffer   * buf,
    231                                   int                 isPieceData );
     231                                  tr_bool             isPieceData );
    232232
    233233/**
     
    256256}
    257257
    258 void      tr_peerIoWriteBytes( tr_peerIo *       io,
    259                                struct evbuffer * outbuf,
    260                                const void *      bytes,
    261                                size_t            byteCount );
    262 
    263 static TR_INLINE void  tr_peerIoWriteUint8( tr_peerIo *       io,
    264                                          struct evbuffer * outbuf,
    265                                          uint8_t           writeme )
     258static TR_INLINE void tr_peerIoWriteBytes( tr_peerIo        * io UNUSED,
     259                                           struct evbuffer  * outbuf,
     260                                           const void       * bytes,
     261                                           size_t             byteCount )
     262{
     263    evbuffer_add( outbuf, bytes, byteCount );
     264}
     265
     266static TR_INLINE void  tr_peerIoWriteUint8( tr_peerIo        * io,
     267                                            struct evbuffer  * outbuf,
     268                                            uint8_t            writeme )
    266269{
    267270    tr_peerIoWriteBytes( io, outbuf, &writeme, sizeof( uint8_t ) );
    268271}
    269272
    270 static TR_INLINE void tr_peerIoWriteUint16( tr_peerIo *      io,
    271                                          struct evbuffer * outbuf,
    272                                          uint16_t          writeme )
     273static TR_INLINE void tr_peerIoWriteUint16( tr_peerIo        * io,
     274                                            struct evbuffer * outbuf,
     275                                            uint16_t           writeme )
    273276{
    274277    const uint16_t tmp = htons( writeme );
     
    276279}
    277280
    278 static TR_INLINE void tr_peerIoWriteUint32( tr_peerIo *      io,
    279                                          struct evbuffer * outbuf,
    280                                          uint32_t          writeme )
     281static TR_INLINE void tr_peerIoWriteUint32( tr_peerIo        * io,
     282                                            struct evbuffer * outbuf,
     283                                            uint32_t           writeme )
    281284{
    282285    const uint32_t tmp = htonl( writeme );
     
    284287}
    285288
    286 void      tr_peerIoReadBytes( tr_peerIo *      io,
    287                               struct evbuffer * inbuf,
    288                               void *            bytes,
    289                               size_t            byteCount );
    290 
    291 static TR_INLINE void tr_peerIoReadUint8( tr_peerIo *      io,
    292                                        struct evbuffer * inbuf,
    293                                        uint8_t *        setme )
     289void tr_peerIoReadBytes( tr_peerIo        * io,
     290                         struct evbuffer * inbuf,
     291                         void             * bytes,
     292                         size_t             byteCount );
     293
     294static TR_INLINE void tr_peerIoReadUint8( tr_peerIo        * io,
     295                                          struct evbuffer * inbuf,
     296                                          uint8_t          * setme )
    294297{
    295298    tr_peerIoReadBytes( io, inbuf, setme, sizeof( uint8_t ) );
    296299}
    297300
    298 static TR_INLINE void tr_peerIoReadUint16( tr_peerIo *      io,
    299                                         struct evbuffer * inbuf,
    300                                         uint16_t *        setme )
     301static TR_INLINE void tr_peerIoReadUint16( tr_peerIo        * io,
     302                                           struct evbuffer * inbuf,
     303                                           uint16_t         * setme )
    301304{
    302305    uint16_t tmp;
     
    305308}
    306309
    307 static TR_INLINE void tr_peerIoReadUint32( tr_peerIo *      io,
    308                                         struct evbuffer * inbuf,
    309                                         uint32_t *        setme )
     310static TR_INLINE void tr_peerIoReadUint32( tr_peerIo        * io,
     311                                           struct evbuffer * inbuf,
     312                                           uint32_t         * setme )
    310313{
    311314    uint32_t tmp;
     
    314317}
    315318
    316 void      tr_peerIoDrain( tr_peerIo *      io,
    317                           struct evbuffer * inbuf,
    318                           size_t            byteCount );
     319void      tr_peerIoDrain( tr_peerIo        * io,
     320                          struct evbuffer  * inbuf,
     321                          size_t             byteCount );
    319322
    320323/**
Note: See TracChangeset for help on using the changeset viewer.