2010-09-13 20:39:11.190 Test[56513:207] NSData *HMAC: <3146268a 86d17682
bab34655 aa8e3140 d34ed7bc>
2010-09-13 20:39:11.191 Test[56513:207] NSString *HMAC64:
MUYmiobRdoK6s0ZVqo4xQNNO17w=

Looks like you're right :-)

@episod: You should fix that! :-)

Tom


On 9/13/10 8:23 PM, Nikolay Klimchuk wrote:
> Still no luck
> 
> With your code I'm gettings exactly the same result
> MUYmiobRdoK6s0ZVqo4xQNNO17w=
> 
> Something really strange in example here http://dev.twitter.com/pages/xauth
> 
> Nikolay Klimchuk
> 
> On Sep 13, 7:19 am, Tom van der Woerdt <i...@tvdw.eu> wrote:
>> Oh, hehe, good point. That's because my Base String has one extra
>> urlencoded '&' on the end, and that shouldn't be there.
>>
>> Tom
>>
>> On Mon, 13 Sep 2010 04:18:06 -0700 (PDT), Nikolay Klimchuk
>>
>>
>>
>> <klimc...@gmail.com> wrote:
>>> Thank you Tom
>>
>>> I will try your algorithm and compare results.
>>> Quick question: why you do this [str substringToIndex:[str
>>> length]-3] ?
>>
>>> Nikolay Klimchuk
>>
>>> On Sep 13, 2:46 am, Tom van der Woerdt <i...@tvdw.eu> wrote:
>>>> Hi Nikolay,
>>
>>>> The first part of your code looks fine. You may, however, like to do
>>>> some debugging on the HMAC part - it looks a bit too simple to me.
>>
>>>> This works :
>>>>         NSString *compKey = [NSString 
>>>> stringWithFormat:@"%@&%@",secret,userSecret];
>>>>         const char *cKey = [compKey 
>>>> cStringUsingEncoding:NSUTF8StringEncoding];
>>>>         const char *cData = [[str substringToIndex:[str length]-3]
>>>> cStringUsingEncoding:NSUTF8StringEncoding];
>>>>         unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
>>>>         CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), 
>>>> cHMAC);
>>>>         NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC 
>>>> length:sizeof(cHMAC)];
>>>> (str being the Base String)
>>
>>>> Hope it helps :-)
>>
>>>> Tom
>>
>>>> On 9/13/10 3:02 AM, Nikolay Klimchuk wrote:
>>
>>>>> I'm trying to understand why algorithm for calculation of
>>>>> oauth_signature does not give me the same result as shown here:
>>>>> http://dev.twitter.com/pages/xauth
>>
>>>>> In my case I'm getting signedSK = 'MUYmiobRdoK6s0ZVqo4xQNNO17w='
>>
>>>>> If I URL encode such result it's still very different from
>>>>> yUDBrcMMm6ghqBEKCFKVoJPIacU%3D
>>
>>>>> I've tried different implementations, all of them give the same
>>>>> result. After few hours of exercises with all this stuff I completely
>>>>> run out of ideas, please help
>>
>>>>> // Test with input data taken from Twitter page
>>
>>>>> NSString *s= @"POST&https%3A%2F%2Fapi.twitter.com%2Foauth
>>>>> %2Faccess_token&oauth_consumer_key%3DsGNxxnqgZRHUt6NunK3uw
>>>>> %26oauth_nonce%3DWLxsobj4rhS2xmCbaAeT4aAkRfx4vSHX4OnYpTE77hA
>>>>> %26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp
>>>>> %3D1276101652%26oauth_version%3D1.0%26x_auth_mode%3Dclient_auth
>>>>> %26x_auth_password%3D%2525%2526123%2521aZ%252B
>>>>> %2528%2529456242134%26x_auth_username%3DtpFriendlyGiant";
>>
>>>>> NSString *k = @"5kEQypKe7lFHnufLtsocB1vAzO07xLFgp2Pc4sp2vk&";
>>
>>>>> NSString *signedSK = [NetworkManager base64forData:[NetworkManager
>>>>> HMACSHA1withKey:k forString:s]];
>>
>>>>> // Source code
>>
>>>>> + (NSData *)HMACSHA1withKey:(NSString *)key forString:(NSString
>>>>> *)string
>>>>> {
>>>>>    NSData *clearTextData = [string
>>>>> dataUsingEncoding:NSUTF8StringEncoding];
>>>>>    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
>>
>>>>>    uint8_t digest[CC_SHA1_DIGEST_LENGTH] = {0};
>>
>>>>>    CCHmacContext hmacContext;
>>>>>    CCHmacInit(&hmacContext, kCCHmacAlgSHA1, keyData.bytes,
>>>>> keyData.length);
>>>>>    CCHmacUpdate(&hmacContext, clearTextData.bytes,
>>>>> clearTextData.length);
>>>>>    CCHmacFinal(&hmacContext, digest);
>>
>>>>>    return [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
>>>>> }
>>
>>>>> //Sourcehttp://www.cocoadev.com/index.pl?BaseSixtyFour
>>
>>>>> + (NSString *)base64forData:(NSData *)data
>>>>> {
>>>>>     static const char encodingTable[] =
>>>>> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
>>
>>>>>     if ([data length] == 0)
>>>>>         return @"";
>>
>>>>>     char *characters = malloc((([data length] + 2) / 3) * 4);
>>>>>     if (characters == NULL)
>>>>>         return nil;
>>>>>     NSUInteger length = 0;
>>
>>>>>     NSUInteger i = 0;
>>>>>     while (i < [data length])
>>>>>     {
>>>>>         char buffer[3] = {0,0,0};
>>>>>         short bufferLength = 0;
>>>>>         while (bufferLength < 3 && i < [data length])
>>>>>                    buffer[bufferLength++] = ((char *)[data bytes])[i++];
>>
>>>>>         //  Encode the bytes in the buffer to four characters,
>>>>> including padding "=" characters if necessary.
>>>>>         characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];
>>>>>         characters[length++] = encodingTable[((buffer[0] & 0x03) << 4)
>>>>> | ((buffer[1] & 0xF0) >> 4)];
>>>>>         if (bufferLength > 1)
>>>>>                    characters[length++] = encodingTable[((buffer[1] & 
>>>>> 0x0F) << 2) |
>>>>> ((buffer[2] & 0xC0) >> 6)];
>>>>>         else characters[length++] = '=';
>>>>>         if (bufferLength > 2)
>>>>>                    characters[length++] = encodingTable[buffer[2] & 0x3F];
>>>>>         else characters[length++] = '=';
>>>>>     }
>>
>>>>>     return [[[NSString alloc] initWithBytesNoCopy:characters
>>>>> length:length encoding:NSASCIIStringEncoding freeWhenDone:YES]
>>>>> autorelease];
>>>>> }
> 

-- 
Twitter developer documentation and resources: http://dev.twitter.com/doc
API updates via Twitter: http://twitter.com/twitterapi
Issues/Enhancements Tracker: http://code.google.com/p/twitter-api/issues/list
Change your membership to this group: 
http://groups.google.com/group/twitter-development-talk?hl=en

Reply via email to