Signal-iOS/SignalServiceKit/src/TestUtils/SignalProtocolHelper.m
2019-09-04 18:21:40 -06:00

96 lines
5.4 KiB
Objective-C

//
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import "SignalProtocolHelper.h"
#import <AxolotlKit/AliceAxolotlParameters.h>
#import <AxolotlKit/BobAxolotlParameters.h>
#import <AxolotlKit/RatchetingSession.h>
#import <AxolotlKit/SessionCipher.h>
#import <SignalCoreKit/SCKExceptionWrapper.h>
NS_ASSUME_NONNULL_BEGIN
@implementation SignalProtocolHelper
+ (BOOL)sessionInitializationWithAliceSessionStore:(id<SessionStore>)aliceSessionStore
aliceIdentityKeyStore:(id<IdentityKeyStore>)aliceIdentityKeyStore
aliceIdentifier:(NSString *)aliceIdentifier
aliceIdentityKeyPair:(ECKeyPair *)aliceIdentityKeyPair
bobSessionStore:(id<SessionStore>)bobSessionStore
bobIdentityKeyStore:(id<IdentityKeyStore>)bobIdentityKeyStore
bobIdentifier:(NSString *)bobIdentifier
bobIdentityKeyPair:(ECKeyPair *)bobIdentityKeyPair
protocolContext:(nullable id<SPKProtocolWriteContext>)protocolContext
error:(NSError **)error
{
return [SCKExceptionWrapper
tryBlock:^{
[self throws_sessionInitializationWithAliceSessionStore:aliceSessionStore
aliceIdentityKeyStore:aliceIdentityKeyStore
aliceIdentifier:aliceIdentifier
aliceIdentityKeyPair:aliceIdentityKeyPair
bobSessionStore:bobSessionStore
bobIdentityKeyStore:bobIdentityKeyStore
bobIdentifier:bobIdentifier
bobIdentityKeyPair:bobIdentityKeyPair
protocolContext:protocolContext];
}
error:error];
}
+ (void)throws_sessionInitializationWithAliceSessionStore:(id<SessionStore>)aliceSessionStore
aliceIdentityKeyStore:(id<IdentityKeyStore>)aliceIdentityKeyStore
aliceIdentifier:(NSString *)aliceIdentifier
aliceIdentityKeyPair:(ECKeyPair *)aliceIdentityKeyPair
bobSessionStore:(id<SessionStore>)bobSessionStore
bobIdentityKeyStore:(id<IdentityKeyStore>)bobIdentityKeyStore
bobIdentifier:(NSString *)bobIdentifier
bobIdentityKeyPair:(ECKeyPair *)bobIdentityKeyPair
protocolContext:(nullable id<SPKProtocolWriteContext>)protocolContext
{
// Alice store's the shared session under Bob's identifier
SessionRecord *aliceSessionRecord = [aliceSessionStore loadSession:bobIdentifier
deviceId:1
protocolContext:protocolContext];
SessionState *aliceSessionState = aliceSessionRecord.sessionState;
// Bob store's the shared session under Alice's identifier
SessionRecord *bobSessionRecord = [bobSessionStore loadSession:aliceIdentifier
deviceId:1
protocolContext:protocolContext];
SessionState *bobSessionState = bobSessionRecord.sessionState;
ECKeyPair *aliceBaseKey = [Curve25519 generateKeyPair];
ECKeyPair *bobBaseKey = [Curve25519 generateKeyPair];
ECKeyPair *bobOneTimePK = [Curve25519 generateKeyPair];
AliceAxolotlParameters *aliceParams = [[AliceAxolotlParameters alloc] initWithIdentityKey:aliceIdentityKeyPair theirIdentityKey:[bobIdentityKeyPair publicKey] ourBaseKey:aliceBaseKey theirSignedPreKey:[bobBaseKey publicKey] theirOneTimePreKey:[bobOneTimePK publicKey] theirRatchetKey:[bobBaseKey publicKey]];
BobAxolotlParameters *bobParams = [[BobAxolotlParameters alloc] initWithMyIdentityKeyPair:bobIdentityKeyPair theirIdentityKey:[aliceIdentityKeyPair publicKey] ourSignedPrekey:bobBaseKey ourRatchetKey:bobBaseKey ourOneTimePrekey:bobOneTimePK theirBaseKey:[aliceBaseKey publicKey]];
[RatchetingSession throws_initializeSession:bobSessionState sessionVersion:3 BobParameters:bobParams];
[RatchetingSession throws_initializeSession:aliceSessionState sessionVersion:3 AliceParameters:aliceParams];
[aliceIdentityKeyStore saveRemoteIdentity:bobIdentityKeyPair.publicKey
recipientId:bobIdentifier
protocolContext:protocolContext];
[aliceSessionStore storeSession:bobIdentifier
deviceId:1
session:aliceSessionRecord
protocolContext:protocolContext];
[bobIdentityKeyStore saveRemoteIdentity:aliceIdentityKeyPair.publicKey
recipientId:aliceIdentifier
protocolContext:protocolContext];
[bobSessionStore storeSession:aliceIdentifier deviceId:1 session:bobSessionRecord protocolContext:protocolContext];
OWSAssertDebug([aliceSessionState.remoteIdentityKey isEqualToData:bobSessionState.localIdentityKey]);
}
@end
NS_ASSUME_NONNULL_END