Signal-iOS/SignalServiceKit/Storage/AxolotlStore/Model/LegacySessionState.m
2024-03-27 12:27:06 -05:00

192 lines
6.1 KiB
Objective-C

//
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
#import "LegacySessionState.h"
#import "LegacyReceivingChain.h"
#import "LegacySendingChain.h"
#import <SignalServiceKit/SignalServiceKit-Swift.h>
@implementation LegacyPendingPreKey
static NSString *const kCoderPreKeyId = @"kCoderPreKeyId";
static NSString *const kCoderSignedPreKeyId = @"kCoderSignedPreKeyId";
static NSString *const kCoderBaseKey = @"kCoderBaseKey";
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (instancetype)initWithBaseKey:(NSData *)baseKey preKeyId:(int)preKeyId signedPreKeyId:(int)signedPrekeyId
{
OWSAssert(baseKey);
self = [super init];
if (self) {
_preKeyId = preKeyId;
_signedPreKeyId = signedPrekeyId;
_baseKey = baseKey;
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [self initWithBaseKey:[aDecoder decodeObjectOfClass:[NSData class] forKey:kCoderBaseKey]
preKeyId:[aDecoder decodeIntForKey:kCoderPreKeyId]
signedPreKeyId:[aDecoder decodeIntForKey:kCoderSignedPreKeyId]];
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_baseKey forKey:kCoderBaseKey];
[aCoder encodeInt:_preKeyId forKey:kCoderPreKeyId];
[aCoder encodeInt:_signedPreKeyId forKey:kCoderSignedPreKeyId];
}
@end
@interface LegacySessionState ()
@property LegacySendingChain *sendingChain; // The outgoing sending chain
@property LegacyPendingPreKey *pendingPreKey;
@end
#pragma mark Keys for coder
static NSString *const kCoderVersion = @"kCoderVersion";
static NSString *const kCoderAliceBaseKey = @"kCoderAliceBaseKey";
static NSString *const kCoderRemoteIDKey = @"kCoderRemoteIDKey";
static NSString *const kCoderLocalIDKey = @"kCoderLocalIDKey";
static NSString *const kCoderPreviousCounter = @"kCoderPreviousCounter";
static NSString *const kCoderRootKey = @"kCoderRoot";
static NSString *const kCoderLocalRegID = @"kCoderLocalRegID";
static NSString *const kCoderRemoteRegID = @"kCoderRemoteRegID";
static NSString *const kCoderReceiverChains = @"kCoderReceiverChains";
static NSString *const kCoderSendingChain = @"kCoderSendingChain";
static NSString *const kCoderPendingPrekey = @"kCoderPendingPrekey";
@implementation LegacySessionState
+ (BOOL)supportsSecureCoding
{
return YES;
}
- (instancetype)init
{
self = [super init];
if (self) {
self.receivingChains = [NSArray array];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [self init];
if (self) {
self.version = [aDecoder decodeIntForKey:kCoderVersion];
self.aliceBaseKey = [aDecoder decodeObjectOfClass:[NSData class] forKey:kCoderAliceBaseKey];
self.remoteIdentityKey = [aDecoder decodeObjectOfClass:[NSData class] forKey:kCoderRemoteIDKey];
self.localIdentityKey = [aDecoder decodeObjectOfClass:[NSData class] forKey:kCoderLocalIDKey];
self.previousCounter = [aDecoder decodeIntForKey:kCoderPreviousCounter];
self.rootKey = [aDecoder decodeObjectOfClass:[NSData class] forKey:kCoderRootKey];
self.remoteRegistrationId = [[aDecoder decodeObjectOfClass:[NSNumber class] forKey:kCoderRemoteRegID] intValue];
self.localRegistrationId = [[aDecoder decodeObjectOfClass:[NSNumber class] forKey:kCoderLocalRegID] intValue];
self.sendingChain = [aDecoder decodeObjectOfClass:[LegacySendingChain class] forKey:kCoderSendingChain];
self.receivingChains = [aDecoder decodeObjectOfClass:[NSArray class] forKey:kCoderReceiverChains];
self.pendingPreKey = [aDecoder decodeObjectOfClass:[LegacyPendingPreKey class] forKey:kCoderPendingPrekey];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeInt:self.version forKey:kCoderVersion];
[aCoder encodeObject:self.aliceBaseKey forKey:kCoderAliceBaseKey];
[aCoder encodeObject:self.remoteIdentityKey forKey:kCoderRemoteIDKey];
[aCoder encodeObject:self.localIdentityKey forKey:kCoderLocalIDKey];
[aCoder encodeInt:self.previousCounter forKey:kCoderPreviousCounter];
[aCoder encodeObject:self.rootKey forKey:kCoderRootKey];
[aCoder encodeObject:[NSNumber numberWithInt:self.remoteRegistrationId] forKey:kCoderRemoteRegID];
[aCoder encodeObject:[NSNumber numberWithInt:self.localRegistrationId] forKey:kCoderLocalRegID];
[aCoder encodeObject:self.sendingChain forKey:kCoderSendingChain];
[aCoder encodeObject:self.receivingChains forKey:kCoderReceiverChains];
[aCoder encodeObject:self.pendingPreKey forKey:kCoderPendingPrekey];
}
- (BOOL)isFresh
{
return self.remoteIdentityKey == nil && self.localIdentityKey == nil && self.sendingChain == nil
&& self.receivingChains.count == 0 && self.pendingPreKey == nil;
}
- (NSData *)senderRatchetKey
{
return [[self senderRatchetKeyPair] publicKey];
}
- (ECKeyPair *)senderRatchetKeyPair
{
return [[self sendingChain] senderRatchetKeyPair];
}
- (void)setSenderChain:(ECKeyPair *)senderRatchetKeyPair chainKey:(LegacyChainKey *)chainKey
{
OWSAssert(senderRatchetKeyPair);
OWSAssert(chainKey);
self.sendingChain = [[LegacySendingChain alloc] initWithChainKey:chainKey
senderRatchetKeyPair:senderRatchetKeyPair];
}
- (LegacyChainKey *)senderChainKey
{
return self.sendingChain.chainKey;
}
- (void)setUnacknowledgedPreKeyMessage:(int)preKeyId signedPreKey:(int)signedPreKeyId baseKey:(NSData *)baseKey
{
OWSAssert(baseKey);
LegacyPendingPreKey *pendingPreKey = [[LegacyPendingPreKey alloc] initWithBaseKey:baseKey
preKeyId:preKeyId
signedPreKeyId:signedPreKeyId];
self.pendingPreKey = pendingPreKey;
}
- (BOOL)hasUnacknowledgedPreKeyMessage
{
return self.pendingPreKey ? YES : NO;
}
- (LegacyPendingPreKey *)unacknowledgedPreKeyMessageItems
{
return self.pendingPreKey;
}
#pragma mark - Logging
+ (NSString *)tag
{
return [NSString stringWithFormat:@"[%@]", self.class];
}
- (NSString *)tag
{
return self.class.tag;
}
@end