session-ios/Signal/src/environment/SignalKeyingStorage.m

94 lines
3.1 KiB
Mathematica
Raw Normal View History

2014-07-11 00:33:51 +02:00
//
// SignalKeyingStorage.m
2014-07-11 00:33:51 +02:00
// Signal
//
// Created by Frederic Jacobs on 09/07/14.
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
//
#import "Constraints.h"
2014-07-11 00:33:51 +02:00
#import "CryptoTools.h"
#import "SignalKeyingStorage.h"
#import "TSStorageManager.h"
#import "Util.h"
2014-07-11 00:33:51 +02:00
#define SignalKeyingCollection @"SignalKeyingCollection"
#define SIGNALING_MAC_KEY_LENGTH 20
2014-07-11 00:33:51 +02:00
#define SIGNALING_CIPHER_KEY_LENGTH 16
#define SAVED_PASSWORD_LENGTH 18
#define SIGNALING_EXTRA_KEY_LENGTH 4
@implementation SignalKeyingStorage
2014-07-11 00:33:51 +02:00
+ (void)generateServerAuthPassword {
[self storeString:[[CryptoTools generateSecureRandomData:SAVED_PASSWORD_LENGTH] encodedAsBase64]
forKey:SAVED_PASSWORD_KEY];
}
+ (void)generateSignaling {
2014-07-11 00:33:51 +02:00
[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];
}
+ (int64_t)getAndIncrementOneTimeCounter {
2014-07-11 00:33:51 +02:00
__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];
2014-07-11 00:33:51 +02:00
return newCounter;
}
+ (NSData *)signalingCipherKey {
2014-07-11 00:33:51 +02:00
return [self dataForKey:SIGNALING_CIPHER_KEY andVerifyLength:SIGNALING_CIPHER_KEY_LENGTH];
}
+ (NSData *)signalingMacKey {
2014-07-11 00:33:51 +02:00
return [self dataForKey:SIGNALING_MAC_KEY andVerifyLength:SIGNALING_MAC_KEY_LENGTH];
}
+ (NSData *)signalingExtraKey {
2014-07-11 00:33:51 +02:00
return [self dataForKey:SIGNALING_EXTRA_KEY andVerifyLength:SIGNALING_EXTRA_KEY_LENGTH];
}
+ (NSString *)serverAuthPassword {
2014-07-11 00:33:51 +02:00
NSString *password = [self stringForKey:SAVED_PASSWORD_KEY];
NSData *data = [password decodedAsBase64Data];
2014-08-14 03:13:24 +02:00
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);
2014-07-11 00:33:51 +02:00
}
return password;
}
#pragma mark Keychain wrapper methods
+ (void)storeData:(NSData *)data forKey:(NSString *)key {
[TSStorageManager.sharedManager setObject:data forKey:key inCollection:SignalKeyingCollection];
2014-07-11 00:33:51 +02:00
}
+ (NSData *)dataForKey:(NSString *)key andVerifyLength:(uint)length {
2014-07-11 00:33:51 +02:00
NSData *data = [self dataForKey:key];
2014-08-14 03:13:24 +02:00
if (data.length != length) {
DDLogError(@"Length of data not matching. Got %lu, expected %u", (unsigned long)data.length, length);
2014-07-11 00:33:51 +02:00
}
2014-07-11 00:33:51 +02:00
return data;
}
+ (NSData *)dataForKey:(NSString *)key {
return [TSStorageManager.sharedManager dataForKey:key inCollection:SignalKeyingCollection];
2014-07-11 00:33:51 +02:00
}
+ (NSString *)stringForKey:(NSString *)key {
return [TSStorageManager.sharedManager stringForKey:key inCollection:SignalKeyingCollection];
2014-07-11 00:33:51 +02:00
}
+ (void)storeString:(NSString *)string forKey:(NSString *)key {
[TSStorageManager.sharedManager setObject:string forKey:key inCollection:SignalKeyingCollection];
2014-07-11 00:33:51 +02:00
}
@end