Bug fixes + Keychain store

pull/1/head
Frederic Jacobs 10 years ago
parent 09fcf2ff0e
commit 2cdb05754c

@ -382,6 +382,7 @@
AA0C8E498E2046B0B81EEE6E /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8313AE91B4954215858A5662 /* libPods.a */; };
B62686301964AE3D00D2D697 /* LogSubmit.m in Sources */ = {isa = PBXBuildFile; fileRef = B626862F1964AE3D00D2D697 /* LogSubmit.m */; };
B67EBF5D19194AC60084CCFD /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = B67EBF5C19194AC60084CCFD /* Settings.bundle */; };
B6B1013C196D213F007E3930 /* SGNKeychainUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B1013B196D213F007E3930 /* SGNKeychainUtil.m */; };
B6B6C3C71919440C00C0B76B /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B6B6C3C51919440C00C0B76B /* Localizable.strings */; };
B90418E6183E9DD40038554A /* DateUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B90418E5183E9DD40038554A /* DateUtil.m */; };
B90418E7183E9DD40038554A /* DateUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B90418E5183E9DD40038554A /* DateUtil.m */; };
@ -1092,6 +1093,8 @@
B626862F1964AE3D00D2D697 /* LogSubmit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LogSubmit.m; sourceTree = "<group>"; };
B657DDC91911A40500F45B0C /* Signal.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Signal.entitlements; sourceTree = "<group>"; };
B67EBF5C19194AC60084CCFD /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Settings.bundle; path = SettingsBundle/Settings.bundle; sourceTree = SOURCE_ROOT; };
B6B1013A196D213F007E3930 /* SGNKeychainUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SGNKeychainUtil.h; sourceTree = "<group>"; };
B6B1013B196D213F007E3930 /* SGNKeychainUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SGNKeychainUtil.m; sourceTree = "<group>"; };
B6B6C3C61919440C00C0B76B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
B6B6C3C81919441D00C0B76B /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; };
B6B6C3C91919448900C0B76B /* ca-ES */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ca-ES"; path = "ca-ES.lproj/Localizable.strings"; sourceTree = "<group>"; };
@ -1670,6 +1673,8 @@
76EB041918170B33006006FC /* PropertyListPreferences.m */,
76EB041A18170B33006006FC /* Release.h */,
76EB041B18170B33006006FC /* Release.m */,
B6B1013A196D213F007E3930 /* SGNKeychainUtil.h */,
B6B1013B196D213F007E3930 /* SGNKeychainUtil.m */,
);
path = environment;
sourceTree = "<group>";
@ -3172,6 +3177,7 @@
76EB054418170B33006006FC /* AsyncUtilHelperRacingOperation.m in Sources */,
76EB060418170B33006006FC /* PhoneNumberDirectoryFilter.m in Sources */,
B97CBFA818860EA3008E0DE9 /* CountryCodeViewController.m in Sources */,
B6B1013C196D213F007E3930 /* SGNKeychainUtil.m in Sources */,
76EB059218170B33006006FC /* UnrecognizedRequestFailure.m in Sources */,
76EB05F818170B33006006FC /* CallConnectUtil_Initiator.m in Sources */,
B97CBFAE1886100E008E0DE9 /* CountryCodeTableViewCell.m in Sources */,

@ -15,6 +15,7 @@
#import "TabBarParentViewController.h"
#import "Util.h"
#import <UICKeyChainStore/UICKeyChainStore.h>
#import "Environment.h"
#define kSignalVersionKey @"SignalUpdateVersionKey"
@ -42,9 +43,11 @@
NSString *currentVersion = [NSString stringWithFormat:@"%@", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]];
if (!previousVersion) {
[UICKeyChainStore removeAllItems];
DDLogError(@"No previous version found. Possibly first launch since install.");
[Environment resetAppData]; // We clean previous keychain entries in case their are some entries remaining.
} else if ([currentVersion compare:previousVersion options:NSNumericSearch] == NSOrderedDescending) {
// The application was updated
DDLogWarn(@"Application was updated from %@ to %@", previousVersion, currentVersion);
}
[[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:kSignalVersionKey];

@ -74,4 +74,8 @@
+(bool) hasEnabledTestingOrLegacyOption:(NSString*)flag;
+(PhoneManager*) phoneManager;
+(BOOL)isRegistered;
-(void)setRegistered;
+(void)resetAppData;
@end

@ -7,6 +7,9 @@
#import "RecentCallManager.h"
#import "ContactsManager.h"
#import "PhoneNumberDirectoryFilterManager.h"
#import "SGNKeychainUtil.h"
#define isRegisteredUserDefaultString @"isRegistered"
static Environment* environment = nil;
@ -143,4 +146,28 @@ static Environment* environment = nil;
return [[Environment getCurrent] logging];
}
+(BOOL)isRegistered{
// Attributes that need to be set
NSData *signalingKey = [SGNKeychainUtil signalingCipherKey];
NSData *macKey = [SGNKeychainUtil signalingMacKey];
NSData *extra = [SGNKeychainUtil signalingExtraKey];
NSString *serverAuth = [SGNKeychainUtil serverAuthPassword];
BOOL registered = [[NSUserDefaults standardUserDefaults] objectForKey:isRegisteredUserDefaultString];
if (signalingKey && macKey && extra && serverAuth && registered) {
return YES;
} else{
return NO;
}
}
-(void)setRegistered:(BOOL)status{
[[NSUserDefaults standardUserDefaults] setObject:status?@YES:@NO forKey:isRegisteredUserDefaultString];
}
+(void)resetAppData{
[SGNKeychainUtil wipeKeychain];
[NSUserDefaults resetStandardUserDefaults];
}
@end

@ -12,15 +12,6 @@
-(void) setSavedPhoneNumberDirectory:(PhoneNumberDirectoryFilter*)phoneNumberDirectoryFilter;
-(NSTimeInterval) getCachedOrDefaultDesiredBufferDepth;
-(void) setCachedDesiredBufferDepth:(double)value;
-(int64_t) getAndIncrementOneTimeCounter;
-(PhoneNumber*) forceGetLocalNumber;
-(PhoneNumber*)tryGetLocalNumber;
-(void) setLocalNumberTo:(PhoneNumber*)localNumber;
-(Zid*) getOrGenerateZid;
-(NSString*) getOrGenerateSavedPassword;
-(NSData*) getOrGenerateSignalingMacKey;
-(NSData*) getOrGenerateSignalingCipherKey;
-(NSData*) getOrGenerateSignalingExtraKey;
-(void) setSettingsRowExpandedPrefs:(NSArray *)prefs;
-(NSArray *) getOrGenerateSettingsRowExpandedPrefs;
-(NSArray *) getAvailableDateFormats;
@ -30,7 +21,6 @@
-(BOOL) getAutocorrectEnabled;
-(BOOL) getHistoryLogEnabled;
-(BOOL) getAnonymousFeedbackEnabled;
-(BOOL) getIsRegistered;
-(NSString *) getDateFormat;
-(void) setDateFormat:(NSString *)format;
@ -39,7 +29,6 @@
-(void) setAutocorrectEnabled:(BOOL)enabled;
-(void) setHistoryLogEnabled:(BOOL)enabled;
-(void) setAnonymousFeedbackEnabled:(BOOL)enabled;
-(void) setIsRegistered:(BOOL)registered;
-(NSString *)getDateFormatKey;

@ -7,22 +7,12 @@
#import "NotificationManifest.h"
#define CALL_STREAM_DES_BUFFER_LEVEL_KEY @"CallStreamDesiredBufferLevel"
#define LOCAL_NUMBER_KEY @"Number"
#define PASSWORD_COUNTER_KEY @"PasswordCounter"
#define SAVED_PASSWORD_KEY @"Password"
#define SIGNALING_MAC_KEY @"Signaling Mac Key"
#define SIGNALING_CIPHER_KEY @"Signaling Cipher Key"
#define ZID_KEY @"ZID"
#define SIGNALING_EXTRA_KEY @"Signaling Extra Key"
#define PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY @"Directory Bloom Hash Count"
#define PHONE_DIRECTORY_BLOOM_FILTER_DATA_KEY @"Directory Bloom Data"
#define PHONE_DIRECTORY_EXPIRATION @"Directory Expiration"
#define DEFAULT_CALL_STREAM_DES_BUFFER_LEVEL 0.5
#define SIGNALING_MAC_KEY_LENGTH 20
#define SIGNALING_CIPHER_KEY_LENGTH 16
#define SAVED_PASSWORD_LENGTH 18
#define SIGNALING_EXTRA_KEY_LENGTH 4
#define SETTINGS_EXPANDED_ROW_PREF_DICT_KEY @"Settings Expanded Row Pref Dict Key"
@ -40,8 +30,6 @@
#define DATE_FORMAT_5 @"yyyy/MM/dd"
#define DATE_FORMAT_6 @"MM/dd/yyyy"
#define IS_REGISTERED_KEY @"Is Registered"
@implementation PropertyListPreferences (PropertyUtil)
-(PhoneNumberDirectoryFilter*) tryGetSavedPhoneNumberDirectory {
@ -73,22 +61,6 @@
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_DIRECTORY_UPDATE object:nil];
}
-(NSData*) getOrGenerateRandomDataWithKey:(NSString*)key andLength:(NSUInteger)length {
require(key != nil);
return [self secureDataStoreAdjustAndTryGetNewValueForKey:key afterAdjuster:^NSData*(NSData* oldValue) {
if (oldValue != nil) {
requireState([oldValue isKindOfClass:[NSData class]]);
requireState([oldValue length] == length);
return oldValue;
}
DDLogInfo(@"A new %@ key of sie %lu has been generated.", key, (unsigned long)length);
return [CryptoTools generateSecureRandomData:length];
}];
}
-(NSTimeInterval) getCachedOrDefaultDesiredBufferDepth {
id v = [self tryGetValueForKey:CALL_STREAM_DES_BUFFER_LEVEL_KEY];
if (v == nil) return DEFAULT_CALL_STREAM_DES_BUFFER_LEVEL;
@ -99,62 +71,6 @@
[self setValueForKey:CALL_STREAM_DES_BUFFER_LEVEL_KEY toValue:[NSNumber numberWithDouble:value]];
}
-(int64_t) getAndIncrementOneTimeCounter {
__block int64_t oldCounter;
[self adjustAndTryGetNewValueForKey:PASSWORD_COUNTER_KEY afterAdjuster:^(id oldValue) {
oldCounter = [oldValue longLongValue];
int64_t newCounter = (oldCounter == INT64_MAX)
? INT64_MIN
: (oldCounter + 1);
return [NSNumber numberWithLongLong:newCounter];
}];
return oldCounter;
}
-(PhoneNumber*) forceGetLocalNumber {
NSString* localNumber = [self tryGetValueForKey:LOCAL_NUMBER_KEY];
checkOperation(localNumber != nil);
return [PhoneNumber tryParsePhoneNumberFromE164:localNumber];
}
-(void) setLocalNumberTo:(PhoneNumber*)localNumber {
require(localNumber != nil);
require([localNumber toE164]!= nil);
[self setValueForKey:LOCAL_NUMBER_KEY toValue:[localNumber toE164]];
}
-(PhoneNumber*)tryGetLocalNumber {
NSString* localNumber = [self tryGetValueForKey:LOCAL_NUMBER_KEY];
return (localNumber != nil ? [PhoneNumber tryParsePhoneNumberFromE164:localNumber] : nil);
}
-(Zid*) getOrGenerateZid {
return [Zid zidWithData:[self getOrGenerateRandomDataWithKey:ZID_KEY andLength:12]];
}
-(NSString*) getOrGenerateSavedPassword {
return [self secureStringStoreAdjustAndTryGetNewValueForKey:SAVED_PASSWORD_KEY afterAdjuster:^NSString*(id oldValue) {
if (oldValue != nil) {
requireState([oldValue isKindOfClass:[NSString class]]);
return oldValue;
}
NSString *string = [[CryptoTools generateSecureRandomData:SAVED_PASSWORD_LENGTH] encodedAsBase64];
return string;
}];
}
-(NSData*) getOrGenerateSignalingMacKey {
return [self getOrGenerateRandomDataWithKey:SIGNALING_MAC_KEY andLength:SIGNALING_MAC_KEY_LENGTH];
}
-(NSData*) getOrGenerateSignalingCipherKey {
return [self getOrGenerateRandomDataWithKey:SIGNALING_CIPHER_KEY andLength:SIGNALING_CIPHER_KEY_LENGTH];
}
-(NSData*) getOrGenerateSignalingExtraKey {
return [self getOrGenerateRandomDataWithKey:SIGNALING_EXTRA_KEY andLength:SIGNALING_EXTRA_KEY_LENGTH];
}
-(void) setSettingsRowExpandedPrefs:(NSArray *)prefs {
[self setValueForKey:SETTINGS_EXPANDED_ROW_PREF_DICT_KEY toValue:prefs];
}
@ -224,15 +140,6 @@
}
}
-(BOOL) getIsRegistered {
NSNumber *preference = [self tryGetValueForKey:IS_REGISTERED_KEY];
if (preference) {
return [preference boolValue];
} else {
return NO;
}
}
-(void) setDateFormat:(NSString *)format {
[self setValueForKey:DATE_FORMAT_KEY toValue:format];
}
@ -252,8 +159,4 @@
-(void) setAnonymousFeedbackEnabled:(BOOL)enabled {
[self setValueForKey:ANONYMOUS_FEEDBACK_ENABLED_KEY toValue:[NSNumber numberWithBool:enabled]];
}
-(void) setIsRegistered:(BOOL)registered {
[self setValueForKey:IS_REGISTERED_KEY toValue:[NSNumber numberWithBool:registered]];
}
@end

@ -0,0 +1,41 @@
//
// SGNKeychainUtil.h
// Signal
//
// Created by Frederic Jacobs on 09/07/14.
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "PhoneNumber.h"
#import "Zid.h"
@interface SGNKeychainUtil : NSObject
+(void)generateKeyingMaterial;
+(void)wipeKeychain;
#pragma mark Registered Phone Number
+(PhoneNumber*)localNumber;
+(void)setLocalNumberTo:(PhoneNumber*)localNumber;
#pragma mark Signaling Key
+(int64_t)getAndIncrementOneTimeCounter;
#pragma mark Zid
+(Zid*)zid;
#pragma mark Server Auth
+(NSString*)serverAuthPassword;
#pragma mark Signaling
+(NSData*)signalingMacKey;
+(NSData*)signalingCipherKey;
+(NSData*)signalingExtraKey;
@end

@ -0,0 +1,141 @@
//
// SGNKeychainUtil.m
// Signal
//
// Created by Frederic Jacobs on 09/07/14.
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
//
#import "CryptoTools.h"
#import "SGNKeychainUtil.h"
#import <UICKeyChainStore/UICKeyChainStore.h>
#import "Constraints.h"
#import "Util.h"
#define LOCAL_NUMBER_KEY @"Number"
#define PASSWORD_COUNTER_KEY @"PasswordCounter"
#define SAVED_PASSWORD_KEY @"Password"
#define SIGNALING_MAC_KEY @"Signaling Mac Key"
#define SIGNALING_CIPHER_KEY @"Signaling Cipher Key"
#define ZID_KEY @"ZID"
#define ZID_LENGTH 12
#define SIGNALING_EXTRA_KEY @"Signaling Extra Key"
#define SIGNALING_MAC_KEY_LENGTH 20
#define SIGNALING_CIPHER_KEY_LENGTH 16
#define SAVED_PASSWORD_LENGTH 18
#define SIGNALING_EXTRA_KEY_LENGTH 4
@implementation SGNKeychainUtil
+ (void)generateKeyingMaterial{
[self storeData:[CryptoTools generateSecureRandomData:SIGNALING_MAC_KEY_LENGTH] forKey:SIGNALING_MAC_KEY];
[self storeData:[CryptoTools generateSecureRandomData:SIGNALING_CIPHER_KEY_LENGTH] forKey:SIGNALING_CIPHER_KEY];
[self storeData:[CryptoTools generateSecureRandomData:SIGNALING_EXTRA_KEY_LENGTH] forKey:SIGNALING_EXTRA_KEY];
[self storeData:[CryptoTools generateSecureRandomData:ZID_LENGTH] forKey:ZID_KEY];
[self storeString:[[CryptoTools generateSecureRandomData:SAVED_PASSWORD_LENGTH] encodedAsBase64] forKey:SAVED_PASSWORD_KEY];
}
+(void)wipeKeychain{
[UICKeyChainStore removeAllItems];
}
+(int64_t) getAndIncrementOneTimeCounter {
__block int64_t oldCounter;
oldCounter = [[UICKeyChainStore stringForKey:PASSWORD_COUNTER_KEY] longLongValue];
int64_t newCounter = (oldCounter == INT64_MAX)?INT64_MIN:(oldCounter + 1);
[self storeString:[[NSNumber numberWithLongLong:newCounter] stringValue] forKey:PASSWORD_COUNTER_KEY];
return newCounter;
}
+ (void)setLocalNumberTo:(PhoneNumber *)localNumber{
require(localNumber != nil);
require([localNumber toE164]!= nil);
NSString *e164 = [localNumber toE164];
[self storeString:e164 forKey:LOCAL_NUMBER_KEY];
}
+ (PhoneNumber *)localNumber{
NSString *lnString = [self stringForKey:LOCAL_NUMBER_KEY];
checkOperation(lnString != nil );
PhoneNumber *num = [PhoneNumber tryParsePhoneNumberFromE164:lnString];
return num;
}
+(Zid *)zid{
NSData *data = [self dataForKey:ZID_KEY];
if ([data length] != ZID_LENGTH) {
DDLogError(@"ZID length is incorrect. Is %lu, should be %d", (unsigned long)[data length], ZID_LENGTH);
}
Zid *zid = [Zid zidWithData:data];
return zid;
}
+(NSData *)signalingCipherKey{
return [self dataForKey:SIGNALING_CIPHER_KEY andVerifyLength:SIGNALING_CIPHER_KEY_LENGTH];
}
+(NSData *)signalingMacKey{
return [self dataForKey:SIGNALING_MAC_KEY andVerifyLength:SIGNALING_MAC_KEY_LENGTH];
}
+ (NSData *)signalingExtraKey{
return [self dataForKey:SIGNALING_EXTRA_KEY andVerifyLength:SIGNALING_EXTRA_KEY_LENGTH];
}
+(NSString *)serverAuthPassword{
NSString *password = [self stringForKey:SAVED_PASSWORD_KEY];
NSData *data = [password decodedAsBase64Data];
if ([data length] != SAVED_PASSWORD_LENGTH) {
DDLogError(@"The server password has incorrect length. Is %lu but should be %d", (unsigned long)[data length], SAVED_PASSWORD_LENGTH);
}
return password;
}
#pragma mark Keychain wrapper methods
+(BOOL)storeData:(NSData*)data forKey:(NSString*)key{
BOOL success = [UICKeyChainStore setData:data forKey:key];
if (!success) {
DDLogError(@"Failed to set value for key: %@", key);
}
return success;
}
+(NSData*)dataForKey:(NSString*)key andVerifyLength:(uint)length{
NSData *data = [self dataForKey:key];
if ([data length] != length) {
DDLogError(@"Length of data not matching. Got %lu, expected %u", [data length], length);
}
return data;
}
+(NSData*)dataForKey:(NSString*)key{
NSData *data = [UICKeyChainStore dataForKey:key];
if (!data) {
DDLogError(@"Failed to get value for key: %@", key);
}
return data;
}
+(NSString*)stringForKey:(NSString*)key{
NSString *string = [UICKeyChainStore stringForKey:key];
if (!string) {
DDLogError(@"Failed to get value for key: %@", key);
}
return string;
}
+(BOOL)storeString:(NSString*)string forKey:(NSString*)key{
BOOL success = [UICKeyChainStore setString:string forKey:key];
if (!success) {
DDLogError(@"Failed to set value for key: %@", key);
}
return success;
}
@end

@ -2,6 +2,7 @@
#import "Constraints.h"
#import "PreferencesUtil.h"
#import "Util.h"
#import "SGNKeychainUtil.h"
@implementation HttpRequest (HttpRequestUtil)
@ -17,8 +18,8 @@
return [HttpRequest httpRequestWithBasicAuthenticationAndMethod:method
andLocation:location
andOptionalBody:optionalBody
andLocalNumber:[[[Environment getCurrent] preferences] forceGetLocalNumber]
andPassword:[[[Environment getCurrent] preferences] getOrGenerateSavedPassword]];
andLocalNumber:[SGNKeychainUtil localNumber]
andPassword:[SGNKeychainUtil serverAuthPassword]];
}
+(HttpRequest*)httpRequestWithOtpAuthenticationAndMethod:(NSString*)method
andLocation:(NSString*)location {
@ -32,9 +33,9 @@
return [HttpRequest httpRequestWithOtpAuthenticationAndMethod:method
andLocation:location
andOptionalBody:optionalBody
andLocalNumber:[[[Environment getCurrent] preferences] forceGetLocalNumber]
andPassword:[[[Environment getCurrent] preferences] getOrGenerateSavedPassword]
andCounter:[[[Environment getCurrent] preferences] getAndIncrementOneTimeCounter]];
andLocalNumber:[SGNKeychainUtil localNumber]
andPassword:[SGNKeychainUtil serverAuthPassword]
andCounter:[SGNKeychainUtil getAndIncrementOneTimeCounter]];
}
+(HttpRequest*)httpRequestUnauthenticatedWithMethod:(NSString*)method
andLocation:(NSString*)location {

@ -7,6 +7,7 @@
#import "Util.h"
#import "ZrtpInitiator.h"
#import "PreferencesUtil.h"
#import "SGNKeychainUtil.h"
#define DHRS1_LENGTH 8
#define DHRS2_LENGTH 8
@ -23,7 +24,7 @@
s->allowedKeyAgreementProtocols = [[Environment getCurrent] keyAgreementProtocolsInDescendingPriority];
s->dhSharedSecretHashes = [DhPacketSharedSecretHashes dhPacketSharedSecretHashesRandomized];
s->zid = [[Environment preferences] getOrGenerateZid];
s->zid = [SGNKeychainUtil zid];
s->confirmIv = [CryptoTools generateSecureRandomData:IV_LENGTH];
s->hashChain = [HashChain hashChainWithSecureGeneratedData];
s->badPacketLogger = [[Environment logging] getOccurrenceLoggerForSender:self withKey:@"Bad Packet"];

@ -8,6 +8,7 @@
#import "ZrtpResponder.h"
#import "HelloAckPacket.h"
#import "ConfirmAckPacket.h"
#import "SGNKeychainUtil.h"
#define DHRS1_LENGTH 8
#define DHRS2_LENGTH 8
@ -29,7 +30,7 @@
s->badPacketLogger = [[Environment logging] getOccurrenceLoggerForSender:self withKey:@"Bad Packet"];
s->localHello = [HelloPacket helloPacketWithDefaultsAndHashChain:s->hashChain
andZid:[[Environment preferences] getOrGenerateZid]
andZid:[SGNKeychainUtil zid]
andKeyAgreementProtocols:s->allowedKeyAgreementProtocols];
s->packetExpectation = EXPECTING_HELLO;
s->callController = callController;

@ -5,6 +5,7 @@
#import "PreferencesUtil.h"
#import "Util.h"
#import "InitiateSignal.pb.h"
#import "SGNKeychainUtil.h"
#define MessagePropertyKey @"m"
#define RelayPortKey @"p"
@ -90,7 +91,7 @@
checkOperation([data length] >= HMAC_TRUNCATED_SIZE);
NSData* includedMac = [data takeLast:HMAC_TRUNCATED_SIZE];
NSData* payload = [data skipLast:HMAC_TRUNCATED_SIZE];
NSData* signalingMacKey = [[Environment preferences] getOrGenerateSignalingMacKey];
NSData* signalingMacKey = [SGNKeychainUtil signalingMacKey];
require(signalingMacKey != nil);
NSData* computedMac = [[payload hmacWithSha1WithKey:signalingMacKey] takeLast:HMAC_TRUNCATED_SIZE];
checkOperation([includedMac isEqualToData_TimingSafe:computedMac]);
@ -99,7 +100,7 @@
+(NSData*) decryptRemoteNotificationData:(NSData*)data {
require(data != nil);
checkOperation([data length] >= VERSION_SIZE + IV_SIZE);
NSData* cipherKey = [[Environment preferences] getOrGenerateSignalingCipherKey];
NSData* cipherKey = [SGNKeychainUtil signalingCipherKey];
NSData* iv = [data subdataWithRange:NSMakeRange(VERSION_SIZE, IV_SIZE)];
NSData* cipherText = [data skip:VERSION_SIZE+IV_SIZE];
return [cipherText decryptWithAesInCipherBlockChainingModeWithPkcs7PaddingWithKey:cipherKey andIv:iv];

@ -4,6 +4,7 @@
#import "Environment.h"
#import "PreferencesUtil.h"
#import "Util.h"
#import "SGNKeychainUtil.h"
#define CLAIMED_INTEROP_VERSION_IN_INITIATE_SIGNAL 1
@ -79,12 +80,12 @@
+(HttpRequest*) httpRequestToVerifyAccessToPhoneNumberWithChallenge:(NSString*)challenge {
require(challenge != nil);
PhoneNumber* localPhoneNumber = [[Environment preferences] forceGetLocalNumber];
PhoneNumber* localPhoneNumber = [SGNKeychainUtil localNumber];
NSString* query = [NSString stringWithFormat:@"/users/verification/%@", [localPhoneNumber toE164]];
NSData* signalingCipherKey = [[Environment preferences] getOrGenerateSignalingCipherKey];
NSData* signalingMacKey = [[Environment preferences] getOrGenerateSignalingMacKey];
NSData* signalingExtraKeyData = [[Environment preferences] getOrGenerateSignalingExtraKey];
NSData* signalingCipherKey = [SGNKeychainUtil signalingCipherKey];
NSData* signalingMacKey = [SGNKeychainUtil signalingMacKey];
NSData* signalingExtraKeyData = [SGNKeychainUtil signalingCipherKey];
NSString* encodedSignalingKey = [[@[signalingCipherKey, signalingMacKey, signalingExtraKeyData] concatDatas] encodedAsBase64];
NSString* body = [@{@"key" : encodedSignalingKey, @"challenge" : challenge} encodedAsJson];

@ -48,7 +48,7 @@ static NSString *const FOOTER_TABLE_CELL_IDENTIFIER = @"InboxFeedFooterCell";
[self observeKeyboardNotifications];
[self setupLabelLocalizationAndStyles];
if (![[Environment preferences] getIsRegistered]) {
if (![Environment isRegistered]) {
RegisterViewController *registerViewController = [RegisterViewController registerViewControllerForApn:_apnId];
[self presentViewController:registerViewController animated:NO completion:nil];
}

@ -8,6 +8,7 @@
#import "PreferencesUtil.h"
#import "RegisterViewController.h"
#import "SignalUtil.h"
#import "SGNKeychainUtil.h"
#import "ThreadManager.h"
#import "Util.h"
@ -41,7 +42,7 @@
_scrollView.contentSize = _containerView.bounds.size;
BOOL isRegisteredAlready = [[Environment preferences] getIsRegistered];
BOOL isRegisteredAlready = [Environment isRegistered];
_registerCancelButton.hidden = !isRegisteredAlready;
[self initializeKeyboardHandlers];
@ -116,10 +117,11 @@
}
-(Future*) asyncRegister:(PhoneNumber*)phoneNumber untilCancelled:(id<CancelToken>)cancelToken {
// @todo: should we force regenerating of all keys?
// @todo: clear current registered status before making a new one, to avoid splinching issues?
[[Environment preferences] setLocalNumberTo:phoneNumber];
[SGNKeychainUtil setLocalNumberTo:phoneNumber];
[SGNKeychainUtil generateKeyingMaterial];
CancellableOperationStarter regStarter = ^Future *(id<CancelToken> internalUntilCancelledToken) {
HttpRequest *registerRequest = [HttpRequest httpRequestToStartRegistrationOfPhoneNumber];

@ -9,6 +9,7 @@
#import "RegisterViewController.h"
#import "SettingsViewController.h"
#import "LogSubmit.h"
#import "SGNKeychainUtil.h"
#import "UIViewController+MMDrawerController.h"
@ -67,7 +68,7 @@ static NSString *const CHECKBOX_EMPTY_IMAGE_NAME = @"checkbox_empty";
#pragma mark - Local number
- (void)configureLocalNumber {
PhoneNumber *localNumber = [[[Environment getCurrent] preferences] tryGetLocalNumber];
PhoneNumber *localNumber = [SGNKeychainUtil localNumber];
if (localNumber) {
_phoneNumberLabel.attributedText = [self localNumberAttributedStringForNumber:localNumber];
} else {

Loading…
Cancel
Save