Changeset 5f40da7 for lib/oauth.c


Ignore:
Timestamp:
2011-12-26T10:51:19Z (13 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
199fea6
Parents:
96f954d (diff), 644b808 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merging oauth-xmpp branch, which adds support for OAuth2 authentication
against some XMPP services (Google Talk, Facebook and Microsoft's MSN-XMPP
gateway).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/oauth.c

    r96f954d r5f40da7  
    3838                         const char *params, struct oauth_info *oi )
    3939{
    40         sha1_state_t sha1;
    4140        uint8_t hash[sha1_hash_size];
    42         uint8_t key[HMAC_BLOCK_SIZE+1];
     41        GString *payload = g_string_new( "" );
     42        char *key;
    4343        char *s;
    44         int i;
    45        
    46         /* Create K. If our current key is >64 chars we have to hash it,
    47            otherwise just pad. */
    48         memset( key, 0, HMAC_BLOCK_SIZE );
    49         i = strlen( oi->sp->consumer_secret ) + 1 + ( oi->token_secret ? strlen( oi->token_secret ) : 0 );
    50         if( i > HMAC_BLOCK_SIZE )
    51         {
    52                 sha1_init( &sha1 );
    53                 sha1_append( &sha1, (uint8_t*) oi->sp->consumer_secret, strlen( oi->sp->consumer_secret ) );
    54                 sha1_append( &sha1, (uint8_t*) "&", 1 );
    55                 if( oi->token_secret )
    56                         sha1_append( &sha1, (uint8_t*) oi->token_secret, strlen( oi->token_secret ) );
    57                 sha1_finish( &sha1, key );
    58         }
    59         else
    60         {
    61                 g_snprintf( (gchar*) key, HMAC_BLOCK_SIZE + 1, "%s&%s",
    62                             oi->sp->consumer_secret, oi->token_secret ? oi->token_secret : "" );
    63         }
    64        
    65         /* Inner part: H(K XOR 0x36, text) */
    66         sha1_init( &sha1 );
    67        
    68         for( i = 0; i < HMAC_BLOCK_SIZE; i ++ )
    69                 key[i] ^= 0x36;
    70         sha1_append( &sha1, key, HMAC_BLOCK_SIZE );
    71        
    72         /* OAuth: text = method&url&params, all http_encoded. */
    73         sha1_append( &sha1, (const uint8_t*) method, strlen( method ) );
    74         sha1_append( &sha1, (const uint8_t*) "&", 1 );
     44       
     45        key = g_strdup_printf( "%s&%s", oi->sp->consumer_secret, oi->token_secret ? oi->token_secret : "" );
     46       
     47        g_string_append_printf( payload, "%s&", method );
    7548       
    7649        s = g_new0( char, strlen( url ) * 3 + 1 );
    7750        strcpy( s, url );
    7851        http_encode( s );
    79         sha1_append( &sha1, (const uint8_t*) s, strlen( s ) );
    80         sha1_append( &sha1, (const uint8_t*) "&", 1 );
     52        g_string_append_printf( payload, "%s&", s );
    8153        g_free( s );
    8254       
     
    8456        strcpy( s, params );
    8557        http_encode( s );
    86         sha1_append( &sha1, (const uint8_t*) s, strlen( s ) );
    87         g_free( s );
    88        
    89         sha1_finish( &sha1, hash );
    90        
    91         /* Final result: H(K XOR 0x5C, inner stuff) */
    92         sha1_init( &sha1 );
    93         for( i = 0; i < HMAC_BLOCK_SIZE; i ++ )
    94                 key[i] ^= 0x36 ^ 0x5c;
    95         sha1_append( &sha1, key, HMAC_BLOCK_SIZE );
    96         sha1_append( &sha1, hash, sha1_hash_size );
    97         sha1_finish( &sha1, hash );
     58        g_string_append( payload, s );
     59        g_free( s );
     60       
     61        sha1_hmac( key, 0, payload->str, 0, hash );
     62       
     63        g_free( key );
     64        g_string_free( payload, TRUE );
    9865       
    9966        /* base64_encode + HTTP escape it (both consumers
     
    12289        char *item;
    12390       
     91        if( !key || !value )
     92                return;
     93       
    12494        item = g_strdup_printf( "%s=%s", key, value );
    12595        *params = g_slist_insert_sorted( *params, item, (GCompareFunc) strcmp );
     
    130100        int key_len = strlen( key );
    131101        GSList *l, *n;
     102       
     103        if( params == NULL )
     104                return;
    132105       
    133106        for( l = *params; l; l = n )
     
    155128        GSList *l;
    156129       
     130        if( params == NULL )
     131                return NULL;
     132       
    157133        for( l = *params; l; l = l->next )
    158134        {
     
    165141}
    166142
    167 static void oauth_params_parse( GSList **params, char *in )
     143void oauth_params_parse( GSList **params, char *in )
    168144{
    169145        char *amp, *eq, *s;
     
    333309                oauth_params_parse( &params, req->reply_body );
    334310                st->request_token = g_strdup( oauth_params_get( &params, "oauth_token" ) );
     311                st->token_secret = g_strdup( oauth_params_get( &params, "oauth_token_secret" ) );
    335312                oauth_params_free( &params );
    336313        }
     
    362339                oauth_params_parse( &st->params, req->reply_body );
    363340                st->token = g_strdup( oauth_params_get( &st->params, "oauth_token" ) );
     341                g_free( st->token_secret );
    364342                st->token_secret = g_strdup( oauth_params_get( &st->params, "oauth_token_secret" ) );
    365343        }
Note: See TracChangeset for help on using the changeset viewer.