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]; } //Source http://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