Changeset 8080


Ignore:
Timestamp:
Mar 24, 2009, 1:39:06 AM (13 years ago)
Author:
jhujhiti
Message:

(trunk libT) #1276 - hash rpc password with sha1

Location:
trunk/libtransmission
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/crypto.c

    r8072 r8080  
    356356
    357357char*
    358 tr_crypt( const void * plaintext )
     358tr_ssha1( const void * plaintext )
    359359{
    360360    static const char * salter = "0123456789"
     
    363363                                 "./";
    364364    static const size_t salter_len = 64;
     365    static const size_t saltval_len = 8;
    365366
    366367    int i;
    367     char salt[12];
    368 
    369     memcpy( salt, "$1$", 3 );
    370     for( i=0; i<8; ++i )
    371         salt[3+i] = salter[ tr_cryptoRandInt( salter_len ) ];
    372     salt[11] = '\0';
    373 
    374     return tr_strdup( DES_crypt( plaintext, salt ) );
    375 }
     368    char salt[saltval_len];
     369    char sha[SHA_DIGEST_LENGTH];
     370    char buf[2*SHA_DIGEST_LENGTH + saltval_len + 2];
     371
     372    for( i=0; i<=saltval_len; ++i )
     373        salt[i] = salter[ tr_cryptoRandInt( salter_len ) ];
     374
     375    tr_sha1( sha, plaintext, strlen( plaintext ), salt, saltval_len, NULL );
     376    tr_sha1_to_hex( &buf[1], &sha );
     377    memcpy( &buf[1+2*SHA_DIGEST_LENGTH], &salt, saltval_len );
     378    buf[1+2*SHA_DIGEST_LENGTH + saltval_len] = '\0';
     379    buf[0] = '{'; /* signal that this is a hash. this makes saving/restoring
     380                     easier */
     381
     382    return tr_strdup( &buf );
     383}
     384
     385tr_bool
     386tr_ssha1_matches( const char * source, const char * pass )
     387{
     388    char * salt;
     389    size_t saltlen;
     390    char * hashed;
     391    char buf[SHA_DIGEST_LENGTH];
     392    tr_bool result;
     393
     394    /* extract the salt */
     395    saltlen = strlen( source ) - 2*SHA_DIGEST_LENGTH-1;
     396    salt = tr_malloc( saltlen );
     397    memcpy( salt, source + 2*SHA_DIGEST_LENGTH+1, saltlen );
     398
     399    /* hash pass + salt */
     400    hashed = tr_malloc( 2*SHA_DIGEST_LENGTH + saltlen + 2 );
     401    tr_sha1( &buf, pass, strlen( pass ), salt, saltlen, NULL );
     402    tr_sha1_to_hex( &hashed[1], &buf );
     403    memcpy( hashed + 1+2*SHA_DIGEST_LENGTH, salt, saltlen );
     404    hashed[1+2*SHA_DIGEST_LENGTH + saltlen] = '\0';
     405    hashed[0] = '{';
     406
     407    result = strcmp( source, hashed ) == 0 ? TRUE : FALSE;
     408
     409    tr_free( hashed );
     410    tr_free( salt );
     411   
     412    return result;
     413}
  • trunk/libtransmission/crypto.h

    r8072 r8080  
    9696                                 size_t         len );
    9797
    98 char*          tr_crypt( const void * plaintext );
     98char*          tr_ssha1( const void * plaintext );
    9999
     100tr_bool        tr_ssha1_matches( const char * source, const char * pass );
    100101
    101102#endif
  • trunk/libtransmission/rpc-server.c

    r8072 r8080  
    466466                user = p;
    467467                *pass++ = '\0';
    468                 pass = tr_crypt( pass );
    469468            }
    470469        }
     
    480479        else if( server->isPasswordEnabled
    481480                 && ( !pass || !user || strcmp( server->username, user )
    482                                      || strcmp( server->password, pass ) ) )
     481                                     || !tr_ssha1_matches( server->password,
     482                                                           pass ) ) )
    483483        {
    484484            evhttp_add_header( req->output_headers,
     
    512512        }
    513513
    514         tr_free( pass );
    515514        tr_free( user );
    516515    }
     
    672671{
    673672    tr_free( server->password );
    674     server->password = tr_crypt( password );
     673    if( *password != '{' )
     674        server->password = tr_ssha1( password );
     675    else
     676        server->password = strdup( password );
    675677    dbgmsg( "setting our Password to [%s]", server->password );
    676678}
     
    763765    found = tr_bencDictFindStr( settings, TR_PREFS_KEY_RPC_PASSWORD, &str );
    764766    assert( found );
    765     s->password = tr_strdup( str );
     767    if( *str != '{' )
     768        s->password = tr_ssha1( str );
     769    else
     770        s->password = strdup( str );
    766771
    767772#ifdef HAVE_ZLIB
Note: See TracChangeset for help on using the changeset viewer.