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