Changeset 7862


Ignore:
Timestamp:
Feb 10, 2009, 3:54:47 PM (13 years ago)
Author:
charles
Message:

(trunk libT) #1776: crash in tr_cryptoComputeSecret()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/crypto.c

    r7658 r7862  
    1 /*
    2  * This file Copyright (C) 2007-2009 Charles Kerr <charles@transmissionbt.com>
     1/* * This file Copyright (C) 2007-2009 Charles Kerr <charles@transmissionbt.com>
    32 *
    43 * This file is licensed by the GPL version 2.  Works owned by the
     
    2221#include <openssl/bn.h>
    2322#include <openssl/dh.h>
     23#include <openssl/err.h>
    2424#include <openssl/rc4.h>
    2525#include <openssl/sha.h>
     
    3030#include "crypto.h"
    3131#include "utils.h"
     32
     33#define MY_NAME "tr_crypto"
    3234
    3335/**
     
    98100**/
    99101
     102#define logErrorFromSSL( ... ) \
     103    do { \
     104        if( tr_msgLoggingIsActive( TR_MSG_ERR ) ) { \
     105            char buf[512]; \
     106            ERR_error_string_n( ERR_get_error( ), buf, sizeof( buf ) ); \
     107            tr_msg( __FILE__, __LINE__, TR_MSG_ERR, MY_NAME, "%s", buf ); \
     108        } \
     109    } while( 0 )
     110
    100111static DH*
    101112getSharedDH( void )
     
    106117    {
    107118        dh = DH_new( );
     119
    108120        dh->p = BN_bin2bn( dh_P, sizeof( dh_P ), NULL );
     121        if( dh->p == NULL )
     122            logErrorFromSSL( );
     123
    109124        dh->g = BN_bin2bn( dh_G, sizeof( dh_G ), NULL );
    110         DH_generate_key( dh );
     125        if( dh->g == NULL )
     126            logErrorFromSSL( );
     127
     128        if( !DH_generate_key( dh ) )
     129            logErrorFromSSL( );
    111130    }
    112131
     
    152171                        const uint8_t * peerPublicKey )
    153172{
    154     int      len, offset;
     173    int      len;
    155174    uint8_t  secret[KEY_LEN];
    156175    BIGNUM * bn = BN_bin2bn( peerPublicKey, KEY_LEN, NULL );
     
    160179
    161180    len = DH_compute_key( secret, bn, dh );
    162     assert( len <= KEY_LEN );
    163     offset = KEY_LEN - len;
    164     memset( crypto->mySecret, 0, offset );
    165     memcpy( crypto->mySecret + offset, secret, len );
    166     crypto->mySecretIsSet = 1;
     181    if( len == -1 )
     182        logErrorFromSSL( );
     183    else {
     184        int offset;
     185        assert( len <= KEY_LEN );
     186        offset = KEY_LEN - len;
     187        memset( crypto->mySecret, 0, offset );
     188        memcpy( crypto->mySecret + offset, secret, len );
     189        crypto->mySecretIsSet = 1;
     190    }
    167191
    168192    BN_free( bn );
    169 
    170193    return crypto->mySecret;
    171194}
     
    194217    assert( crypto->mySecretIsSet );
    195218
    196     SHA1_Init( &sha );
    197     SHA1_Update( &sha, key, 4 );
    198     SHA1_Update( &sha, crypto->mySecret, KEY_LEN );
    199     SHA1_Update( &sha, crypto->torrentHash, SHA_DIGEST_LENGTH );
    200     SHA1_Final( buf, &sha );
    201     RC4_set_key( setme, SHA_DIGEST_LENGTH, buf );
     219    if( SHA1_Init( &sha )
     220        && SHA1_Update( &sha, key, 4 )
     221        && SHA1_Update( &sha, crypto->mySecret, KEY_LEN )
     222        && SHA1_Update( &sha, crypto->torrentHash, SHA_DIGEST_LENGTH )
     223        && SHA1_Final( buf, &sha ) )
     224    {
     225        RC4_set_key( setme, SHA_DIGEST_LENGTH, buf );
     226    }
     227    else
     228    {
     229        logErrorFromSSL( );
     230    }
    202231}
    203232
     
    307336                  size_t         len )
    308337{
    309     RAND_pseudo_bytes ( buf, len );
    310 }
    311 
     338    if( RAND_pseudo_bytes ( buf, len ) != 1 )
     339        logErrorFromSSL( );
     340}
     341
Note: See TracChangeset for help on using the changeset viewer.