mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Objective-C
		
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Objective-C
		
	
//
 | 
						|
//  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
 | 
						|
//
 | 
						|
 | 
						|
#import "SignalKeyingStorage.h"
 | 
						|
#import <SignalCoreKit/Randomness.h>
 | 
						|
#import <SignalServiceKit/OWSPrimaryStorage.h>
 | 
						|
#import <SignalServiceKit/YapDatabaseConnection+OWS.h>
 | 
						|
 | 
						|
#define SignalKeyingCollection @"SignalKeyingCollection"
 | 
						|
 | 
						|
#define SIGNALING_MAC_KEY_LENGTH 20
 | 
						|
#define SIGNALING_CIPHER_KEY_LENGTH 16
 | 
						|
#define SIGNALING_EXTRA_KEY_LENGTH 4
 | 
						|
 | 
						|
@implementation SignalKeyingStorage
 | 
						|
 | 
						|
+ (void)generateSignaling
 | 
						|
{
 | 
						|
    [self storeData:[Randomness generateRandomBytes:SIGNALING_MAC_KEY_LENGTH] forKey:SIGNALING_MAC_KEY];
 | 
						|
    [self storeData:[Randomness generateRandomBytes:SIGNALING_CIPHER_KEY_LENGTH] forKey:SIGNALING_CIPHER_KEY];
 | 
						|
    [self storeData:[Randomness generateRandomBytes:SIGNALING_EXTRA_KEY_LENGTH] forKey:SIGNALING_EXTRA_KEY];
 | 
						|
}
 | 
						|
 | 
						|
+ (int64_t)getAndIncrementOneTimeCounter
 | 
						|
{
 | 
						|
    __block int64_t oldCounter;
 | 
						|
    oldCounter = [[self stringForKey:PASSWORD_COUNTER_KEY] longLongValue];
 | 
						|
    int64_t newCounter = (oldCounter == INT64_MAX) ? INT64_MIN : (oldCounter + 1);
 | 
						|
    [self storeString:[@(newCounter) stringValue] forKey:PASSWORD_COUNTER_KEY];
 | 
						|
    return newCounter;
 | 
						|
}
 | 
						|
 | 
						|
+ (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];
 | 
						|
}
 | 
						|
 | 
						|
#pragma mark Keychain wrapper methods
 | 
						|
 | 
						|
+ (void)storeData:(NSData *)data forKey:(NSString *)key
 | 
						|
{
 | 
						|
    [OWSPrimaryStorage.dbReadWriteConnection setObject:data forKey:key inCollection:SignalKeyingCollection];
 | 
						|
}
 | 
						|
 | 
						|
+ (NSData *)dataForKey:(NSString *)key andVerifyLength:(uint)length
 | 
						|
{
 | 
						|
    NSData *data = [self dataForKey:key];
 | 
						|
 | 
						|
    if (data.length != length) {
 | 
						|
        OWSLogError(@"Length of data not matching. Got %lu, expected %u", (unsigned long)data.length, length);
 | 
						|
    }
 | 
						|
 | 
						|
    return data;
 | 
						|
}
 | 
						|
 | 
						|
+ (NSData *)dataForKey:(NSString *)key
 | 
						|
{
 | 
						|
    return [OWSPrimaryStorage.dbReadConnection dataForKey:key inCollection:SignalKeyingCollection];
 | 
						|
}
 | 
						|
 | 
						|
+ (NSString *)stringForKey:(NSString *)key
 | 
						|
{
 | 
						|
    return [OWSPrimaryStorage.dbReadConnection stringForKey:key inCollection:SignalKeyingCollection];
 | 
						|
}
 | 
						|
 | 
						|
+ (void)storeString:(NSString *)string forKey:(NSString *)key
 | 
						|
{
 | 
						|
    [OWSPrimaryStorage.dbReadWriteConnection setObject:string forKey:key inCollection:SignalKeyingCollection];
 | 
						|
}
 | 
						|
 | 
						|
@end
 |