Merge branch 'AdvancedNetworkLogging'

pull/1/head
Frederic Jacobs 10 years ago
commit ad6ff23618

@ -168,6 +168,7 @@ static Environment* environment = nil;
+(void)resetAppData{
[SGNKeychainUtil wipeKeychain];
[NSUserDefaults resetStandardUserDefaults];
[[[Environment getCurrent] preferences] clear];
}
@end

@ -25,6 +25,7 @@
relatedInfo:(id)relatedInfo
causedTermination:(bool)causedTermination {
DDLogError(@"Pack handler failed with error: %@ and info: %@", error, relatedInfo);
errorHandler(error, relatedInfo, causedTermination);
}

@ -12,7 +12,7 @@
require(macKey != nil);
require(cipherIvSalt != nil);
require([cipherIvSalt length] == IV_SALT_LENGTH);
SrtpStream* s = [SrtpStream new];
s->cipherIvSalt = cipherIvSalt;
s->macKey = macKey;
@ -24,38 +24,38 @@
-(RtpPacket*) encryptAndAuthenticateNormalRtpPacket:(RtpPacket*)normalRtpPacket {
require(normalRtpPacket != nil);
NSData* payload = [normalRtpPacket payload];
NSData* iv = [self getIvForSequenceNumber:[normalRtpPacket sequenceNumber] andSynchronizationSourceIdentifier:[normalRtpPacket synchronizationSourceIdentifier]];
NSData* encryptedPayload = [payload encryptWithAesInCounterModeWithKey:cipherKey andIv:iv];
RtpPacket* encryptedRtpPacket = [normalRtpPacket withPayload:encryptedPayload];
NSData* hmac = [[encryptedRtpPacket rawPacketDataUsingInteropOptions:@[]] hmacWithSha1WithKey:macKey];
NSData* authenticatedEncryptedPayload = [@[encryptedPayload, hmac] concatDatas];
return [encryptedRtpPacket withPayload:authenticatedEncryptedPayload];
}
-(RtpPacket*) verifyAuthenticationAndDecryptSecuredRtpPacket:(RtpPacket*)securedRtpPacket {
require(securedRtpPacket != nil);
checkOperationDescribe([[securedRtpPacket payload] length] >= HMAC_LENGTH, @"Payload not long enough to include hmac");
NSData* authenticatedData = [securedRtpPacket rawPacketDataUsingInteropOptions:nil];
NSData* includedHmac = [authenticatedData takeLastVolatile:HMAC_LENGTH];
NSData* expectedHmac = [[authenticatedData skipLastVolatile:HMAC_LENGTH] hmacWithSha1WithKey:macKey];
checkOperationDescribe([expectedHmac length] == HMAC_LENGTH, @"Hmac length constant is wrong");
checkOperationDescribe([includedHmac isEqualToData_TimingSafe:expectedHmac], @"Authentication failed.");
NSData* iv = [self getIvForSequenceNumber:[securedRtpPacket sequenceNumber] andSynchronizationSourceIdentifier:[securedRtpPacket synchronizationSourceIdentifier]];
NSData* encryptedPayload = [[securedRtpPacket payload] skipLastVolatile:HMAC_LENGTH];
NSData* decryptedPayload = [encryptedPayload decryptWithAesInCounterModeWithKey:cipherKey andIv:iv];
return [securedRtpPacket withPayload:decryptedPayload];
}
-(NSData*)getIvForSequenceNumber:(uint16_t)sequenceNumber andSynchronizationSourceIdentifier:(uint64_t)synchronizationSourceIdentifier {
int64_t logicalSequence = [sequenceCounter convertNext:sequenceNumber];
NSMutableData* iv = [NSMutableData dataWithLength:IV_LENGTH];
[iv replaceBytesStartingAt:0 withData:cipherIvSalt];
uint8_t* b = (uint8_t*)[iv bytes];
@ -67,7 +67,7 @@
b[11] ^= (uint8_t)((logicalSequence >> 16) & 0xFF);
b[12] ^= (uint8_t)((logicalSequence >> 8) & 0xFF);
b[13] ^= (uint8_t)((logicalSequence >> 0) & 0xFF);
return iv;
}

@ -74,6 +74,7 @@
NSStreamStatus status = [outputStream streamStatus];
if (status < NSStreamStatusOpen) return;
if (status >= NSStreamStatusAtEnd) {
DDLogError(@"Status of the stream: %lu", status);
[rawDataHandler handleError:@"Wrote to ended/closed/errored stream."
relatedInfo:nil
causedTermination:false];
@ -123,6 +124,7 @@
[futureOpenedSource trySetFailure:error];
[futureConnectedAndWritableSource trySetFailure:error];
[rawDataHandler handleError:error relatedInfo:nil causedTermination:true];
DDLogError(@"Network failure happened on network stream: %@", error);
[self terminate];
}
}
@ -159,9 +161,20 @@
}
-(void) onErrorOccurred:(id)fallbackError {
id error = [inputStream streamError];
if (error == nil) error = [outputStream streamError];
if (error == nil) error = fallbackError;
NSError *error;
DDLogError(@"Stream status: %@", self.description);
if ([inputStream streamError]) {
error = [inputStream streamError];
DDLogError(@"Error on incoming stream : %@");
} else if ([outputStream streamError]){
error = [outputStream streamError];
DDLogError(@"Error on outgoing stream: %@", error);
} else{
error = fallbackError;
DDLogError(@"Fallback error: %@", fallbackError);
}
[self onNetworkFailure:error];
}

@ -78,8 +78,6 @@
NSString* relayServerName = parsedPayload.serverName;
PhoneNumber* phoneNumber = [PhoneNumber phoneNumberFromE164:parsedPayload.initiator];
DDLogDebug(@"Initiating call with session descriptor: %i UDP-Port:%hu sessionID:%lld, relayServerName:%@", interopVersion, relayUdpPort, sessionId, relayServerName);
return [ResponderSessionDescriptor responderSessionDescriptorWithInteropVersion:interopVersion
andRelayUdpPort:relayUdpPort
andSessionId:sessionId

@ -5,16 +5,19 @@
#import "HttpRequestUtil.h"
#import "PreferencesUtil.h"
#import "SignalUtil.h"
#import "SGNKeychainUtil.h"
#import <UICKeyChainStore/UICKeyChainStore.h>
@implementation HttpRequestResponseTest
-(void) testRequestToInitiate {
[Environment setCurrent:testEnv];
[[[Environment getCurrent] preferences] setLocalNumberTo:[PhoneNumber phoneNumberFromE164:@"+19027778888"]];
[[[Environment getCurrent] preferences] setValueForKey:@"Password" toValue:@"shall_not_password"];
[SGNKeychainUtil setLocalNumberTo:[PhoneNumber phoneNumberFromE164:@"+19025555555"]];
[UICKeyChainStore setString:@"shall_not_password" forKey:@"Password"];
[[[Environment getCurrent] preferences] setValueForKey:@"PasswordCounter" toValue:@2357];
HttpRequest* h = [HttpRequest httpRequestToInitiateToRemoteNumber:[PhoneNumber phoneNumberFromE164:@"+19023334444"]];
test([[h method] isEqualToString:@"GET"]);
test([[h location] isEqualToString:@"/session/1/+19023334444"]);
NSLog(@"HTTP rep: %@", [h toHttp]);
test([[h toHttp] isEqualToString:@"GET /session/1/+19023334444 HTTP/1.0\r\nAuthorization: OTP KzE5MDI3Nzc4ODg4OmluQ3lLcE1ZaFRQS0ZwN3BITlN3bUxVMVpCTT06MjM1Nw==\r\n\r\n"]);
test([h isEqualToHttpRequest:[HttpRequest httpRequestFromData:[h serialize]]]);
}
@ -27,9 +30,9 @@
}
-(void) testRequestToRing {
[Environment setCurrent:testEnv];
[[[Environment getCurrent] preferences] setLocalNumberTo:[PhoneNumber phoneNumberFromE164:@"+19025555555"]];
[[[Environment getCurrent] preferences] setValueForKey:@"Password" toValue:@"shall_not_password"];
[[[Environment getCurrent] preferences] setValueForKey:@"PasswordCounter" toValue:@0];
[SGNKeychainUtil setLocalNumberTo:[PhoneNumber phoneNumberFromE164:@"+19025555555"]];
[UICKeyChainStore setString:@"shall_not_password" forKey:@"Password"];
[UICKeyChainStore setString:[@0 stringValue] forKey:@"PasswordCounter"];
HttpRequest* h = [HttpRequest httpRequestToRingWithSessionId:458847238];
test([[h method] isEqualToString:@"RING"]);
test([[h location] isEqualToString:@"/session/458847238"]);

Loading…
Cancel
Save