Remove phone numbers from scannable QR Code

Initially they were there to offer richer error messages when the wrong
code was scanned.

However, we found that people were posting them publicly,
misunderstanding the QR codes to be a kind of personal identifier.

For one, this isn't useful because the QR codes, like safety numbers,
are unique *per* conversation. So they aren't useful in a generic sense.
And secondly this is bad because the QR code contains both parties phone
numbers.

// FREEBIE
pull/1/head
Michael Kirk 9 years ago
parent 70e536ca8f
commit 60a39f93c6

@ -35,7 +35,7 @@ PODS:
- ProtocolBuffers (1.9.10) - ProtocolBuffers (1.9.10)
- Reachability (3.2) - Reachability (3.2)
- SAMKeychain (1.5.0) - SAMKeychain (1.5.0)
- SignalServiceKit (0.6.0): - SignalServiceKit (0.7.0):
- '25519' - '25519'
- AFNetworking - AFNetworking
- AxolotlKit - AxolotlKit
@ -130,7 +130,7 @@ SPEC CHECKSUMS:
ProtocolBuffers: d088180c10072b3d24a9939a6314b7b9bcc2340b ProtocolBuffers: d088180c10072b3d24a9939a6314b7b9bcc2340b
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
SAMKeychain: 1fc9ae02f576365395758b12888c84704eebc423 SAMKeychain: 1fc9ae02f576365395758b12888c84704eebc423
SignalServiceKit: c580eb2197f87212fcba9f7faf56163f410225e9 SignalServiceKit: f32dd13f4bdc46276e2e090719f3a88288fd78ad
SocketRocket: 3f77ec2104cc113add553f817ad90a77114f5d43 SocketRocket: 3f77ec2104cc113add553f817ad90a77114f5d43
SQLCipher: 4c768761421736a247ed6cf412d9045615d53dff SQLCipher: 4c768761421736a247ed6cf412d9045615d53dff
TwistedOakCollapsingFutures: f359b90f203e9ab13dfb92c9ff41842a7fe1cd0c TwistedOakCollapsingFutures: f359b90f203e9ab13dfb92c9ff41842a7fe1cd0c

@ -8,7 +8,7 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = "SignalServiceKit" s.name = "SignalServiceKit"
s.version = "0.6.0" s.version = "0.7.0"
s.summary = "An Objective-C library for communicating with the Signal messaging service." s.summary = "An Objective-C library for communicating with the Signal messaging service."
s.description = <<-DESC s.description = <<-DESC

@ -1,18 +1,18 @@
package textsecure; package textsecure;
option java_package = "org.whispersystems.libaxolotl.fingerprint"; option java_package = "org.whispersystems.libsignal.fingerprint";
option java_outer_classname = "FingerprintProtos"; option java_outer_classname = "FingerprintProtos";
import "objectivec-descriptor.proto"; import "objectivec-descriptor.proto";
option (google.protobuf.objectivec_file_options).class_prefix = "OWSFingerprintProtos"; option (google.protobuf.objectivec_file_options).class_prefix = "OWSFingerprintProtos";
message FingerprintData { message LogicalFingerprint {
optional bytes publicKey = 1; optional bytes identityData = 1;
optional bytes identifier = 2; // optional bytes identifier = 2;
} }
message CombinedFingerprint { message LogicalFingerprints {
optional uint32 version = 1; optional uint32 version = 1;
optional FingerprintData localFingerprint = 2; optional LogicalFingerprint localFingerprint = 2;
optional FingerprintData remoteFingerprint = 3; optional LogicalFingerprint remoteFingerprint = 3;
} }

@ -7,26 +7,31 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSFingerprint : NSObject @interface OWSFingerprint : NSObject
#pragma mark - Initializers
- (instancetype)init NS_UNAVAILABLE; - (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithMyStableId:(NSString *)myStableId - (instancetype)initWithMyStableId:(NSString *)myStableId
myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType
theirStableId:(NSString *)theirStableId theirStableId:(NSString *)theirStableId
theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType
theirName:(NSString *)theirName
hashIterations:(uint32_t)hashIterations NS_DESIGNATED_INITIALIZER; hashIterations:(uint32_t)hashIterations NS_DESIGNATED_INITIALIZER;
+ (instancetype)fingerprintWithMyStableId:(NSString *)myStableId + (instancetype)fingerprintWithMyStableId:(NSString *)myStableId
myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType
theirStableId:(NSString *)theirStableId theirStableId:(NSString *)theirStableId
theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType
theirName:(NSString *)theirName
hashIterations:(uint32_t)hashIterations; hashIterations:(uint32_t)hashIterations;
+ (instancetype)fingerprintWithMyStableId:(NSString *)myStableId + (instancetype)fingerprintWithMyStableId:(NSString *)myStableId
myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType
theirStableId:(NSString *)theirStableId theirStableId:(NSString *)theirStableId
theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType; theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType
theirName:(NSString *)theirName;
- (BOOL)matchesCombinedFingerprintData:(NSData *)combinedFingerprintData error:(NSError **)error; #pragma mark - Properties
@property (nonatomic, readonly) NSData *myStableIdData; @property (nonatomic, readonly) NSData *myStableIdData;
@property (nonatomic, readonly) NSData *myIdentityKey; @property (nonatomic, readonly) NSData *myIdentityKey;
@ -34,7 +39,11 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly) NSData *theirStableIdData; @property (nonatomic, readonly) NSData *theirStableIdData;
@property (nonatomic, readonly) NSData *theirIdentityKey; @property (nonatomic, readonly) NSData *theirIdentityKey;
@property (nonatomic, readonly) NSString *displayableText; @property (nonatomic, readonly) NSString *displayableText;
@property (nonatomic, readonly) UIImage *image; @property (nullable, nonatomic, readonly) UIImage *image;
#pragma mark - Instance Methods
- (BOOL)matchesLogicalFingerprintsData:(NSData *)data error:(NSError **)error;
@end @end

@ -11,13 +11,17 @@
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
static uint32_t const OWSFingerprintVersion = 0; static uint32_t const OWSFingerprintHashingVersion = 0;
static uint32_t const OWSFingerprintScannableFormatVersion = 1;
static uint32_t const OWSFingerprintDefaultHashIterations = 5200; static uint32_t const OWSFingerprintDefaultHashIterations = 5200;
@interface OWSFingerprint () @interface OWSFingerprint ()
@property (nonatomic, readonly) NSUInteger hashIterations; @property (nonatomic, readonly) NSUInteger hashIterations;
@property (nonatomic, readonly) NSString *text; @property (nonatomic, readonly) NSString *text;
@property (nonatomic, readonly) NSData *myFingerprintData;
@property (nonatomic, readonly) NSData *theirFingerprintData;
@property (nonatomic, readonly) NSString *theirName;
@end @end
@ -27,6 +31,7 @@ static uint32_t const OWSFingerprintDefaultHashIterations = 5200;
myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType
theirStableId:(NSString *)theirStableId theirStableId:(NSString *)theirStableId
theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType
theirName:(NSString *)theirName
hashIterations:(uint32_t)hashIterations hashIterations:(uint32_t)hashIterations
{ {
NSParameterAssert(theirIdentityKeyWithoutKeyType.length == 32); NSParameterAssert(theirIdentityKeyWithoutKeyType.length == 32);
@ -42,9 +47,11 @@ static uint32_t const OWSFingerprintDefaultHashIterations = 5200;
_theirStableId = theirStableId; _theirStableId = theirStableId;
_theirStableIdData = [theirStableId dataUsingEncoding:NSUTF8StringEncoding]; _theirStableIdData = [theirStableId dataUsingEncoding:NSUTF8StringEncoding];
_theirIdentityKey = [theirIdentityKeyWithoutKeyType prependKeyType]; _theirIdentityKey = [theirIdentityKeyWithoutKeyType prependKeyType];
_theirName = theirName;
_hashIterations = hashIterations; _hashIterations = hashIterations;
_text = [self generateText];
_image = [self generateImage]; _myFingerprintData = [self dataForStableId:_myStableIdData publicKey:_myIdentityKey];
_theirFingerprintData = [self dataForStableId:_theirStableIdData publicKey:_theirIdentityKey];
return self; return self;
} }
@ -53,12 +60,14 @@ static uint32_t const OWSFingerprintDefaultHashIterations = 5200;
myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType
theirStableId:(NSString *)theirStableId theirStableId:(NSString *)theirStableId
theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType
theirName:(NSString *)theirName
hashIterations:(uint32_t)hashIterations hashIterations:(uint32_t)hashIterations
{ {
return [[self alloc] initWithMyStableId:myStableId return [[self alloc] initWithMyStableId:myStableId
myIdentityKey:myIdentityKeyWithoutKeyType myIdentityKey:myIdentityKeyWithoutKeyType
theirStableId:theirStableId theirStableId:theirStableId
theirIdentityKey:theirIdentityKeyWithoutKeyType theirIdentityKey:theirIdentityKeyWithoutKeyType
theirName:theirName
hashIterations:hashIterations]; hashIterations:hashIterations];
} }
@ -66,19 +75,21 @@ static uint32_t const OWSFingerprintDefaultHashIterations = 5200;
myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType myIdentityKey:(NSData *)myIdentityKeyWithoutKeyType
theirStableId:(NSString *)theirStableId theirStableId:(NSString *)theirStableId
theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType theirIdentityKey:(NSData *)theirIdentityKeyWithoutKeyType
theirName:(NSString *)theirName
{ {
return [[self alloc] initWithMyStableId:myStableId return [[self alloc] initWithMyStableId:myStableId
myIdentityKey:myIdentityKeyWithoutKeyType myIdentityKey:myIdentityKeyWithoutKeyType
theirStableId:theirStableId theirStableId:theirStableId
theirIdentityKey:theirIdentityKeyWithoutKeyType theirIdentityKey:theirIdentityKeyWithoutKeyType
theirName:theirName
hashIterations:OWSFingerprintDefaultHashIterations]; hashIterations:OWSFingerprintDefaultHashIterations];
} }
- (BOOL)matchesCombinedFingerprintData:(NSData *)data error:(NSError **)error - (BOOL)matchesLogicalFingerprintsData:(NSData *)data error:(NSError **)error
{ {
OWSFingerprintProtosCombinedFingerprint *combinedFingerprint; OWSFingerprintProtosLogicalFingerprints *logicalFingerprints;
@try { @try {
combinedFingerprint = [OWSFingerprintProtosCombinedFingerprint parseFromData:data]; logicalFingerprints = [OWSFingerprintProtosLogicalFingerprints parseFromData:data];
} @catch (NSException *exception) { } @catch (NSException *exception) {
if ([exception.name isEqualToString:@"InvalidProtocolBuffer"]) { if ([exception.name isEqualToString:@"InvalidProtocolBuffer"]) {
NSString *description = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILURE_INVALID_QRCODE", @"alert body"); NSString *description = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILURE_INVALID_QRCODE", @"alert body");
@ -91,59 +102,39 @@ static uint32_t const OWSFingerprintDefaultHashIterations = 5200;
} }
} }
if (combinedFingerprint.version < OWSFingerprintVersion) { if (logicalFingerprints.version < OWSFingerprintScannableFormatVersion) {
DDLogWarn(@"%@ Verification failed. We're running an old version.", self.tag); DDLogWarn(@"%@ Verification failed. They're running an old version.", self.tag);
NSString *description NSString *description
= NSLocalizedString(@"PRIVACY_VERIFICATION_FAILED_WITH_OLD_REMOTE_VERSION", @"alert body"); = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILED_WITH_OLD_REMOTE_VERSION", @"alert body");
*error = OWSErrorWithCodeDescription(OWSErrorCodePrivacyVerificationFailure, description); *error = OWSErrorWithCodeDescription(OWSErrorCodePrivacyVerificationFailure, description);
return NO; return NO;
} }
if (combinedFingerprint.version > OWSFingerprintVersion) { if (logicalFingerprints.version > OWSFingerprintScannableFormatVersion) {
DDLogWarn(@"%@ Verification failed. They're running an old version.", self.tag); DDLogWarn(@"%@ Verification failed. We're running an old version.", self.tag);
NSString *description = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILED_WITH_OLD_LOCAL_VERSION", @"alert body"); NSString *description = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILED_WITH_OLD_LOCAL_VERSION", @"alert body");
*error = OWSErrorWithCodeDescription(OWSErrorCodePrivacyVerificationFailure, description); *error = OWSErrorWithCodeDescription(OWSErrorCodePrivacyVerificationFailure, description);
return NO; return NO;
} }
// Their local is *our* remote. // Their local is *our* remote.
OWSFingerprintProtosFingerprintData *localFingerprint = combinedFingerprint.remoteFingerprint; OWSFingerprintProtosLogicalFingerprint *localFingerprint = logicalFingerprints.remoteFingerprint;
OWSFingerprintProtosFingerprintData *remoteFingerprint = combinedFingerprint.localFingerprint; OWSFingerprintProtosLogicalFingerprint *remoteFingerprint = logicalFingerprints.localFingerprint;
if (![remoteFingerprint.identifier isEqual:self.theirStableIdData]) { if (![remoteFingerprint.identityData isEqual:[self scannableData:self.theirFingerprintData]]) {
DDLogWarn(@"%@ Verification failed. We're expecting a different contact.", self.tag); DDLogWarn(@"%@ Verification failed. We have the wrong fingerprint for them", self.tag);
NSString *errorFormat = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILED_WITH_MISMATCHED_REMOTE_IDENTIFIER", NSString *descriptionFormat = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILED_I_HAVE_WRONG_KEY_FOR_THEM",
@"Alert body {{expected phone number}}, {{actual phone number we found}}"); @"Alert body when verifying with {{contact name}}");
NSString *expected = [[NSString alloc] initWithData:self.theirStableIdData encoding:NSUTF8StringEncoding]; NSString *description = [NSString stringWithFormat:descriptionFormat, self.theirName];
NSString *actual = [[NSString alloc] initWithData:remoteFingerprint.identifier encoding:NSUTF8StringEncoding];
NSString *description = [NSString stringWithFormat:errorFormat, expected, actual];
*error = OWSErrorWithCodeDescription(OWSErrorCodePrivacyVerificationFailure, description);
return NO;
}
if (![localFingerprint.identifier isEqual:self.myStableIdData]) {
DDLogWarn(@"%@ Verification failed. They presented the wrong fingerprint.", self.tag);
NSString *errorFormat = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILED_WITH_MISMATCHED_LOCAL_IDENTIFIER",
@"Alert body {{expected phone number}}, {{actual phone number we found}}");
NSString *expected = [[NSString alloc] initWithData:self.myStableIdData encoding:NSUTF8StringEncoding];
NSString *actual = [[NSString alloc] initWithData:localFingerprint.identifier encoding:NSUTF8StringEncoding];
NSString *description = [NSString stringWithFormat:errorFormat, expected, actual];
*error = OWSErrorWithCodeDescription(OWSErrorCodePrivacyVerificationFailure, description);
return NO;
}
if (![localFingerprint.publicKey isEqual:self.myIdentityKey]) {
DDLogWarn(@"%@ Verification failed. They have the wrong key for us", self.tag);
NSString *description = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILED_WITH_MISMATCHED_KEYS", @"Alert body");
*error = OWSErrorWithCodeDescription(OWSErrorCodePrivacyVerificationFailure, description); *error = OWSErrorWithCodeDescription(OWSErrorCodePrivacyVerificationFailure, description);
return NO; return NO;
} }
if (![remoteFingerprint.publicKey isEqual:self.theirIdentityKey]) { if (![localFingerprint.identityData isEqual:[self scannableData:self.myFingerprintData]]) {
DDLogWarn(@"%@ Verification failed. We have the wrong key for them", self.tag); DDLogWarn(@"%@ Verification failed. They have the wrong fingerprint for us", self.tag);
NSString *description = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILED_WITH_MISMATCHED_KEYS", @"Alert body"); NSString *descriptionFormat = NSLocalizedString(@"PRIVACY_VERIFICATION_FAILED_THEY_HAVE_WRONG_KEY_FOR_ME",
@"Alert body when verifying with {{contact name}}");
NSString *description = [NSString stringWithFormat:descriptionFormat, self.theirName];
*error = OWSErrorWithCodeDescription(OWSErrorCodePrivacyVerificationFailure, description); *error = OWSErrorWithCodeDescription(OWSErrorCodePrivacyVerificationFailure, description);
return NO; return NO;
} }
@ -152,11 +143,10 @@ static uint32_t const OWSFingerprintDefaultHashIterations = 5200;
return YES; return YES;
} }
- (NSString *)text
- (NSString *)generateText
{ {
NSString *myDisplayString = [self stringForStableId:self.myStableIdData publicKey:self.myIdentityKey]; NSString *myDisplayString = [self stringForFingerprintData:self.myFingerprintData];
NSString *theirDisplayString = [self stringForStableId:self.theirStableIdData publicKey:self.theirIdentityKey]; NSString *theirDisplayString = [self stringForFingerprintData:self.theirFingerprintData];
if ([theirDisplayString compare:myDisplayString] == NSOrderedAscending) { if ([theirDisplayString compare:myDisplayString] == NSOrderedAscending) {
return [NSString stringWithFormat:@"%@%@", theirDisplayString, myDisplayString]; return [NSString stringWithFormat:@"%@%@", theirDisplayString, myDisplayString];
@ -200,9 +190,12 @@ static uint32_t const OWSFingerprintDefaultHashIterations = 5200;
* @return * @return
* All-number textual representation * All-number textual representation
*/ */
- (NSString *)stringForStableId:(NSData *)stableIdData publicKey:(NSData *)publicKey - (NSData *)dataForStableId:(NSData *)stableIdData publicKey:(NSData *)publicKey
{ {
NSData *versionData = [self dataFromShort:OWSFingerprintVersion]; NSParameterAssert(stableIdData);
NSParameterAssert(publicKey);
NSData *versionData = [self dataFromShort:OWSFingerprintHashingVersion];
NSMutableData *hash = [NSMutableData dataWithData:versionData]; NSMutableData *hash = [NSMutableData dataWithData:versionData];
[hash appendData:publicKey]; [hash appendData:publicKey];
[hash appendData:stableIdData]; [hash appendData:stableIdData];
@ -215,17 +208,27 @@ static uint32_t const OWSFingerprintDefaultHashIterations = 5200;
hash = [NSMutableData dataWithBytes:digest length:CC_SHA512_DIGEST_LENGTH]; hash = [NSMutableData dataWithBytes:digest length:CC_SHA512_DIGEST_LENGTH];
} }
return [hash copy];
}
- (NSString *)stringForFingerprintData:(NSData *)data
{
NSParameterAssert(data);
return [NSString stringWithFormat:@"%@%@%@%@%@%@", return [NSString stringWithFormat:@"%@%@%@%@%@%@",
[self encodedChunkFromData:hash offset:0], [self encodedChunkFromData:data offset:0],
[self encodedChunkFromData:hash offset:5], [self encodedChunkFromData:data offset:5],
[self encodedChunkFromData:hash offset:10], [self encodedChunkFromData:data offset:10],
[self encodedChunkFromData:hash offset:15], [self encodedChunkFromData:data offset:15],
[self encodedChunkFromData:hash offset:20], [self encodedChunkFromData:data offset:20],
[self encodedChunkFromData:hash offset:25]]; [self encodedChunkFromData:data offset:25]];
} }
- (NSString *)encodedChunkFromData:(NSData *)data offset:(uint)offset - (NSString *)encodedChunkFromData:(NSData *)data offset:(uint)offset
{ {
NSParameterAssert(data);
uint8_t fiveBytes[5]; uint8_t fiveBytes[5];
[data getBytes:fiveBytes range:NSMakeRange(offset, 5)]; [data getBytes:fiveBytes range:NSMakeRange(offset, 5)];
@ -244,27 +247,33 @@ static uint32_t const OWSFingerprintDefaultHashIterations = 5200;
return result; return result;
} }
- (nullable UIImage *)generateImage - (NSData *)scannableData:(NSData *)data
{
return [data subdataWithRange:NSMakeRange(0, 32)];
}
- (nullable UIImage *)image
{ {
OWSFingerprintProtosCombinedFingerprintBuilder *combinedFingerprintBuilder = OWSFingerprintProtosLogicalFingerprintsBuilder *logicalFingerprintsBuilder =
[OWSFingerprintProtosCombinedFingerprintBuilder new]; [OWSFingerprintProtosLogicalFingerprintsBuilder new];
[combinedFingerprintBuilder setVersion:OWSFingerprintVersion]; logicalFingerprintsBuilder.version = OWSFingerprintScannableFormatVersion;
OWSFingerprintProtosFingerprintDataBuilder *remoteFingerprintDataBuilder = OWSFingerprintProtosLogicalFingerprintBuilder *remoteFingerprintBuilder =
[OWSFingerprintProtosFingerprintDataBuilder new]; [OWSFingerprintProtosLogicalFingerprintBuilder new];
[remoteFingerprintDataBuilder setPublicKey:self.theirIdentityKey];
[remoteFingerprintDataBuilder setIdentifier:self.theirStableIdData];
[combinedFingerprintBuilder setRemoteFingerprintBuilder:remoteFingerprintDataBuilder];
OWSFingerprintProtosFingerprintDataBuilder *localFingerprintDataBuilder = remoteFingerprintBuilder.identityData = [self scannableData:self.theirFingerprintData];
[OWSFingerprintProtosFingerprintDataBuilder new]; logicalFingerprintsBuilder.remoteFingerprint = [remoteFingerprintBuilder build];
[localFingerprintDataBuilder setPublicKey:self.myIdentityKey];
[localFingerprintDataBuilder setIdentifier:self.myStableIdData]; OWSFingerprintProtosLogicalFingerprintBuilder *localFingerprintBuilder =
[combinedFingerprintBuilder setLocalFingerprintBuilder:localFingerprintDataBuilder]; [OWSFingerprintProtosLogicalFingerprintBuilder new];
localFingerprintBuilder.identityData = [self scannableData:self.myFingerprintData];
logicalFingerprintsBuilder.localFingerprint = [localFingerprintBuilder build];
// Build ByteMode QR (Latin-1 encodable data) // Build ByteMode QR (Latin-1 encodable data)
NSData *fingerprintData = [combinedFingerprintBuilder build].data; NSData *fingerprintData = [logicalFingerprintsBuilder build].data;
DDLogDebug(@"%@ Building fingerprint with data: %@", self.tag, fingerprintData); DDLogDebug(@"%@ Building fingerprint with data: %@", self.tag, fingerprintData);
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

@ -5,11 +5,13 @@ NS_ASSUME_NONNULL_BEGIN
@class TSStorageManager; @class TSStorageManager;
@class OWSFingerprint; @class OWSFingerprint;
@protocol ContactsManagerProtocol;
@interface OWSFingerprintBuilder : NSObject @interface OWSFingerprintBuilder : NSObject
- (instancetype)init NS_UNAVAILABLE; - (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithStorageManager:(TSStorageManager *)storageManager NS_DESIGNATED_INITIALIZER; - (instancetype)initWithStorageManager:(TSStorageManager *)storageManager
contactsManager:(id<ContactsManagerProtocol>)contactsManager NS_DESIGNATED_INITIALIZER;
/** /**
* Builds a fingerprint combining your current credentials with their most recently accepted credentials. * Builds a fingerprint combining your current credentials with their most recently accepted credentials.

@ -2,6 +2,7 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved. // Copyright © 2016 Open Whisper Systems. All rights reserved.
#import "OWSFingerprintBuilder.h" #import "OWSFingerprintBuilder.h"
#import "ContactsManagerProtocol.h"
#import "OWSFingerprint.h" #import "OWSFingerprint.h"
#import "TSStorageManager+IdentityKeyStore.h" #import "TSStorageManager+IdentityKeyStore.h"
#import "TSStorageManager+keyingMaterial.h" #import "TSStorageManager+keyingMaterial.h"
@ -12,12 +13,14 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSFingerprintBuilder () @interface OWSFingerprintBuilder ()
@property (nonatomic, readonly) TSStorageManager *storageManager; @property (nonatomic, readonly) TSStorageManager *storageManager;
@property (nonatomic, readonly) id<ContactsManagerProtocol> contactsManager;
@end @end
@implementation OWSFingerprintBuilder @implementation OWSFingerprintBuilder
- (instancetype)initWithStorageManager:(TSStorageManager *)storageManager - (instancetype)initWithStorageManager:(TSStorageManager *)storageManager
contactsManager:(id<ContactsManagerProtocol>)contactsManager
{ {
self = [super init]; self = [super init];
if (!self) { if (!self) {
@ -25,6 +28,7 @@ NS_ASSUME_NONNULL_BEGIN
} }
_storageManager = storageManager; _storageManager = storageManager;
_contactsManager = contactsManager;
return self; return self;
} }
@ -38,12 +42,16 @@ NS_ASSUME_NONNULL_BEGIN
- (OWSFingerprint *)fingerprintWithTheirSignalId:(NSString *)theirSignalId theirIdentityKey:(NSData *)theirIdentityKey - (OWSFingerprint *)fingerprintWithTheirSignalId:(NSString *)theirSignalId theirIdentityKey:(NSData *)theirIdentityKey
{ {
NSString *theirName = [self.contactsManager nameStringForPhoneIdentifier:theirSignalId];
NSString *mySignalId = [self.storageManager localNumber]; NSString *mySignalId = [self.storageManager localNumber];
NSData *myIdentityKey = [self.storageManager identityKeyPair].publicKey; NSData *myIdentityKey = [self.storageManager identityKeyPair].publicKey;
return [OWSFingerprint fingerprintWithMyStableId:mySignalId return [OWSFingerprint fingerprintWithMyStableId:mySignalId
myIdentityKey:myIdentityKey myIdentityKey:myIdentityKey
theirStableId:theirSignalId theirStableId:theirSignalId
theirIdentityKey:theirIdentityKey]; theirIdentityKey:theirIdentityKey
theirName:theirName];
} }
@end @end

@ -4,10 +4,10 @@
// @@protoc_insertion_point(imports) // @@protoc_insertion_point(imports)
@class OWSFingerprintProtosCombinedFingerprint; @class OWSFingerprintProtosLogicalFingerprint;
@class OWSFingerprintProtosCombinedFingerprintBuilder; @class OWSFingerprintProtosLogicalFingerprintBuilder;
@class OWSFingerprintProtosFingerprintData; @class OWSFingerprintProtosLogicalFingerprints;
@class OWSFingerprintProtosFingerprintDataBuilder; @class OWSFingerprintProtosLogicalFingerprintsBuilder;
@class ObjectiveCFileOptions; @class ObjectiveCFileOptions;
@class ObjectiveCFileOptionsBuilder; @class ObjectiveCFileOptionsBuilder;
@class PBDescriptorProto; @class PBDescriptorProto;
@ -61,138 +61,128 @@
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry; + (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
@end @end
#define FingerprintData_publicKey @"publicKey" #define LogicalFingerprint_identityData @"identityData"
#define FingerprintData_identifier @"identifier" @interface OWSFingerprintProtosLogicalFingerprint : PBGeneratedMessage<GeneratedMessageProtocol> {
@interface OWSFingerprintProtosFingerprintData : PBGeneratedMessage<GeneratedMessageProtocol> {
@private @private
BOOL hasPublicKey_:1; BOOL hasIdentityData_:1;
BOOL hasIdentifier_:1; NSData* identityData;
NSData* publicKey;
NSData* identifier;
} }
- (BOOL) hasPublicKey; - (BOOL) hasIdentityData;
- (BOOL) hasIdentifier; @property (readonly, strong) NSData* identityData;
@property (readonly, strong) NSData* publicKey;
@property (readonly, strong) NSData* identifier;
+ (instancetype) defaultInstance; + (instancetype) defaultInstance;
- (instancetype) defaultInstance; - (instancetype) defaultInstance;
- (BOOL) isInitialized; - (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; - (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (OWSFingerprintProtosFingerprintDataBuilder*) builder; - (OWSFingerprintProtosLogicalFingerprintBuilder*) builder;
+ (OWSFingerprintProtosFingerprintDataBuilder*) builder; + (OWSFingerprintProtosLogicalFingerprintBuilder*) builder;
+ (OWSFingerprintProtosFingerprintDataBuilder*) builderWithPrototype:(OWSFingerprintProtosFingerprintData*) prototype; + (OWSFingerprintProtosLogicalFingerprintBuilder*) builderWithPrototype:(OWSFingerprintProtosLogicalFingerprint*) prototype;
- (OWSFingerprintProtosFingerprintDataBuilder*) toBuilder; - (OWSFingerprintProtosLogicalFingerprintBuilder*) toBuilder;
+ (OWSFingerprintProtosFingerprintData*) parseFromData:(NSData*) data; + (OWSFingerprintProtosLogicalFingerprint*) parseFromData:(NSData*) data;
+ (OWSFingerprintProtosFingerprintData*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + (OWSFingerprintProtosLogicalFingerprint*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSFingerprintProtosFingerprintData*) parseFromInputStream:(NSInputStream*) input; + (OWSFingerprintProtosLogicalFingerprint*) parseFromInputStream:(NSInputStream*) input;
+ (OWSFingerprintProtosFingerprintData*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + (OWSFingerprintProtosLogicalFingerprint*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSFingerprintProtosFingerprintData*) parseFromCodedInputStream:(PBCodedInputStream*) input; + (OWSFingerprintProtosLogicalFingerprint*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (OWSFingerprintProtosFingerprintData*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + (OWSFingerprintProtosLogicalFingerprint*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end @end
@interface OWSFingerprintProtosFingerprintDataBuilder : PBGeneratedMessageBuilder { @interface OWSFingerprintProtosLogicalFingerprintBuilder : PBGeneratedMessageBuilder {
@private @private
OWSFingerprintProtosFingerprintData* resultFingerprintData; OWSFingerprintProtosLogicalFingerprint* resultLogicalFingerprint;
} }
- (OWSFingerprintProtosFingerprintData*) defaultInstance; - (OWSFingerprintProtosLogicalFingerprint*) defaultInstance;
- (OWSFingerprintProtosFingerprintDataBuilder*) clear; - (OWSFingerprintProtosLogicalFingerprintBuilder*) clear;
- (OWSFingerprintProtosFingerprintDataBuilder*) clone; - (OWSFingerprintProtosLogicalFingerprintBuilder*) clone;
- (OWSFingerprintProtosFingerprintData*) build; - (OWSFingerprintProtosLogicalFingerprint*) build;
- (OWSFingerprintProtosFingerprintData*) buildPartial; - (OWSFingerprintProtosLogicalFingerprint*) buildPartial;
- (OWSFingerprintProtosFingerprintDataBuilder*) mergeFrom:(OWSFingerprintProtosFingerprintData*) other; - (OWSFingerprintProtosLogicalFingerprintBuilder*) mergeFrom:(OWSFingerprintProtosLogicalFingerprint*) other;
- (OWSFingerprintProtosFingerprintDataBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; - (OWSFingerprintProtosLogicalFingerprintBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (OWSFingerprintProtosFingerprintDataBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; - (OWSFingerprintProtosLogicalFingerprintBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
- (BOOL) hasPublicKey; - (BOOL) hasIdentityData;
- (NSData*) publicKey; - (NSData*) identityData;
- (OWSFingerprintProtosFingerprintDataBuilder*) setPublicKey:(NSData*) value; - (OWSFingerprintProtosLogicalFingerprintBuilder*) setIdentityData:(NSData*) value;
- (OWSFingerprintProtosFingerprintDataBuilder*) clearPublicKey; - (OWSFingerprintProtosLogicalFingerprintBuilder*) clearIdentityData;
- (BOOL) hasIdentifier;
- (NSData*) identifier;
- (OWSFingerprintProtosFingerprintDataBuilder*) setIdentifier:(NSData*) value;
- (OWSFingerprintProtosFingerprintDataBuilder*) clearIdentifier;
@end @end
#define CombinedFingerprint_version @"version" #define LogicalFingerprints_version @"version"
#define CombinedFingerprint_localFingerprint @"localFingerprint" #define LogicalFingerprints_localFingerprint @"localFingerprint"
#define CombinedFingerprint_remoteFingerprint @"remoteFingerprint" #define LogicalFingerprints_remoteFingerprint @"remoteFingerprint"
@interface OWSFingerprintProtosCombinedFingerprint : PBGeneratedMessage<GeneratedMessageProtocol> { @interface OWSFingerprintProtosLogicalFingerprints : PBGeneratedMessage<GeneratedMessageProtocol> {
@private @private
BOOL hasLocalFingerprint_:1; BOOL hasLocalFingerprint_:1;
BOOL hasRemoteFingerprint_:1; BOOL hasRemoteFingerprint_:1;
BOOL hasVersion_:1; BOOL hasVersion_:1;
OWSFingerprintProtosFingerprintData* localFingerprint; OWSFingerprintProtosLogicalFingerprint* localFingerprint;
OWSFingerprintProtosFingerprintData* remoteFingerprint; OWSFingerprintProtosLogicalFingerprint* remoteFingerprint;
UInt32 version; UInt32 version;
} }
- (BOOL) hasVersion; - (BOOL) hasVersion;
- (BOOL) hasLocalFingerprint; - (BOOL) hasLocalFingerprint;
- (BOOL) hasRemoteFingerprint; - (BOOL) hasRemoteFingerprint;
@property (readonly) UInt32 version; @property (readonly) UInt32 version;
@property (readonly, strong) OWSFingerprintProtosFingerprintData* localFingerprint; @property (readonly, strong) OWSFingerprintProtosLogicalFingerprint* localFingerprint;
@property (readonly, strong) OWSFingerprintProtosFingerprintData* remoteFingerprint; @property (readonly, strong) OWSFingerprintProtosLogicalFingerprint* remoteFingerprint;
+ (instancetype) defaultInstance; + (instancetype) defaultInstance;
- (instancetype) defaultInstance; - (instancetype) defaultInstance;
- (BOOL) isInitialized; - (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; - (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) builder; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) builder;
+ (OWSFingerprintProtosCombinedFingerprintBuilder*) builder; + (OWSFingerprintProtosLogicalFingerprintsBuilder*) builder;
+ (OWSFingerprintProtosCombinedFingerprintBuilder*) builderWithPrototype:(OWSFingerprintProtosCombinedFingerprint*) prototype; + (OWSFingerprintProtosLogicalFingerprintsBuilder*) builderWithPrototype:(OWSFingerprintProtosLogicalFingerprints*) prototype;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) toBuilder; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) toBuilder;
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromData:(NSData*) data; + (OWSFingerprintProtosLogicalFingerprints*) parseFromData:(NSData*) data;
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + (OWSFingerprintProtosLogicalFingerprints*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromInputStream:(NSInputStream*) input; + (OWSFingerprintProtosLogicalFingerprints*) parseFromInputStream:(NSInputStream*) input;
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + (OWSFingerprintProtosLogicalFingerprints*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromCodedInputStream:(PBCodedInputStream*) input; + (OWSFingerprintProtosLogicalFingerprints*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + (OWSFingerprintProtosLogicalFingerprints*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end @end
@interface OWSFingerprintProtosCombinedFingerprintBuilder : PBGeneratedMessageBuilder { @interface OWSFingerprintProtosLogicalFingerprintsBuilder : PBGeneratedMessageBuilder {
@private @private
OWSFingerprintProtosCombinedFingerprint* resultCombinedFingerprint; OWSFingerprintProtosLogicalFingerprints* resultLogicalFingerprints;
} }
- (OWSFingerprintProtosCombinedFingerprint*) defaultInstance; - (OWSFingerprintProtosLogicalFingerprints*) defaultInstance;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) clear; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) clear;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) clone; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) clone;
- (OWSFingerprintProtosCombinedFingerprint*) build; - (OWSFingerprintProtosLogicalFingerprints*) build;
- (OWSFingerprintProtosCombinedFingerprint*) buildPartial; - (OWSFingerprintProtosLogicalFingerprints*) buildPartial;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) mergeFrom:(OWSFingerprintProtosCombinedFingerprint*) other; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) mergeFrom:(OWSFingerprintProtosLogicalFingerprints*) other;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
- (BOOL) hasVersion; - (BOOL) hasVersion;
- (UInt32) version; - (UInt32) version;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) setVersion:(UInt32) value; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) setVersion:(UInt32) value;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) clearVersion; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) clearVersion;
- (BOOL) hasLocalFingerprint; - (BOOL) hasLocalFingerprint;
- (OWSFingerprintProtosFingerprintData*) localFingerprint; - (OWSFingerprintProtosLogicalFingerprint*) localFingerprint;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) setLocalFingerprint:(OWSFingerprintProtosFingerprintData*) value; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) setLocalFingerprint:(OWSFingerprintProtosLogicalFingerprint*) value;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) setLocalFingerprintBuilder:(OWSFingerprintProtosFingerprintDataBuilder*) builderForValue; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) setLocalFingerprintBuilder:(OWSFingerprintProtosLogicalFingerprintBuilder*) builderForValue;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) mergeLocalFingerprint:(OWSFingerprintProtosFingerprintData*) value; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) mergeLocalFingerprint:(OWSFingerprintProtosLogicalFingerprint*) value;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) clearLocalFingerprint; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) clearLocalFingerprint;
- (BOOL) hasRemoteFingerprint; - (BOOL) hasRemoteFingerprint;
- (OWSFingerprintProtosFingerprintData*) remoteFingerprint; - (OWSFingerprintProtosLogicalFingerprint*) remoteFingerprint;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) setRemoteFingerprint:(OWSFingerprintProtosFingerprintData*) value; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) setRemoteFingerprint:(OWSFingerprintProtosLogicalFingerprint*) value;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) setRemoteFingerprintBuilder:(OWSFingerprintProtosFingerprintDataBuilder*) builderForValue; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) setRemoteFingerprintBuilder:(OWSFingerprintProtosLogicalFingerprintBuilder*) builderForValue;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) mergeRemoteFingerprint:(OWSFingerprintProtosFingerprintData*) value; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) mergeRemoteFingerprint:(OWSFingerprintProtosLogicalFingerprint*) value;
- (OWSFingerprintProtosCombinedFingerprintBuilder*) clearRemoteFingerprint; - (OWSFingerprintProtosLogicalFingerprintsBuilder*) clearRemoteFingerprint;
@end @end

@ -21,55 +21,43 @@ static PBExtensionRegistry* extensionRegistry = nil;
} }
@end @end
@interface OWSFingerprintProtosFingerprintData () @interface OWSFingerprintProtosLogicalFingerprint ()
@property (strong) NSData* publicKey; @property (strong) NSData* identityData;
@property (strong) NSData* identifier;
@end @end
@implementation OWSFingerprintProtosFingerprintData @implementation OWSFingerprintProtosLogicalFingerprint
- (BOOL) hasPublicKey { - (BOOL) hasIdentityData {
return !!hasPublicKey_; return !!hasIdentityData_;
} }
- (void) setHasPublicKey:(BOOL) _value_ { - (void) setHasIdentityData:(BOOL) _value_ {
hasPublicKey_ = !!_value_; hasIdentityData_ = !!_value_;
} }
@synthesize publicKey; @synthesize identityData;
- (BOOL) hasIdentifier {
return !!hasIdentifier_;
}
- (void) setHasIdentifier:(BOOL) _value_ {
hasIdentifier_ = !!_value_;
}
@synthesize identifier;
- (instancetype) init { - (instancetype) init {
if ((self = [super init])) { if ((self = [super init])) {
self.publicKey = [NSData data]; self.identityData = [NSData data];
self.identifier = [NSData data];
} }
return self; return self;
} }
static OWSFingerprintProtosFingerprintData* defaultOWSFingerprintProtosFingerprintDataInstance = nil; static OWSFingerprintProtosLogicalFingerprint* defaultOWSFingerprintProtosLogicalFingerprintInstance = nil;
+ (void) initialize { + (void) initialize {
if (self == [OWSFingerprintProtosFingerprintData class]) { if (self == [OWSFingerprintProtosLogicalFingerprint class]) {
defaultOWSFingerprintProtosFingerprintDataInstance = [[OWSFingerprintProtosFingerprintData alloc] init]; defaultOWSFingerprintProtosLogicalFingerprintInstance = [[OWSFingerprintProtosLogicalFingerprint alloc] init];
} }
} }
+ (instancetype) defaultInstance { + (instancetype) defaultInstance {
return defaultOWSFingerprintProtosFingerprintDataInstance; return defaultOWSFingerprintProtosLogicalFingerprintInstance;
} }
- (instancetype) defaultInstance { - (instancetype) defaultInstance {
return defaultOWSFingerprintProtosFingerprintDataInstance; return defaultOWSFingerprintProtosLogicalFingerprintInstance;
} }
- (BOOL) isInitialized { - (BOOL) isInitialized {
return YES; return YES;
} }
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output { - (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
if (self.hasPublicKey) { if (self.hasIdentityData) {
[output writeData:1 value:self.publicKey]; [output writeData:1 value:self.identityData];
}
if (self.hasIdentifier) {
[output writeData:2 value:self.identifier];
} }
[self.unknownFields writeToCodedOutputStream:output]; [self.unknownFields writeToCodedOutputStream:output];
} }
@ -80,61 +68,52 @@ static OWSFingerprintProtosFingerprintData* defaultOWSFingerprintProtosFingerpri
} }
size_ = 0; size_ = 0;
if (self.hasPublicKey) { if (self.hasIdentityData) {
size_ += computeDataSize(1, self.publicKey); size_ += computeDataSize(1, self.identityData);
}
if (self.hasIdentifier) {
size_ += computeDataSize(2, self.identifier);
} }
size_ += self.unknownFields.serializedSize; size_ += self.unknownFields.serializedSize;
memoizedSerializedSize = size_; memoizedSerializedSize = size_;
return size_; return size_;
} }
+ (OWSFingerprintProtosFingerprintData*) parseFromData:(NSData*) data { + (OWSFingerprintProtosLogicalFingerprint*) parseFromData:(NSData*) data {
return (OWSFingerprintProtosFingerprintData*)[[[OWSFingerprintProtosFingerprintData builder] mergeFromData:data] build]; return (OWSFingerprintProtosLogicalFingerprint*)[[[OWSFingerprintProtosLogicalFingerprint builder] mergeFromData:data] build];
} }
+ (OWSFingerprintProtosFingerprintData*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + (OWSFingerprintProtosLogicalFingerprint*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSFingerprintProtosFingerprintData*)[[[OWSFingerprintProtosFingerprintData builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; return (OWSFingerprintProtosLogicalFingerprint*)[[[OWSFingerprintProtosLogicalFingerprint builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
} }
+ (OWSFingerprintProtosFingerprintData*) parseFromInputStream:(NSInputStream*) input { + (OWSFingerprintProtosLogicalFingerprint*) parseFromInputStream:(NSInputStream*) input {
return (OWSFingerprintProtosFingerprintData*)[[[OWSFingerprintProtosFingerprintData builder] mergeFromInputStream:input] build]; return (OWSFingerprintProtosLogicalFingerprint*)[[[OWSFingerprintProtosLogicalFingerprint builder] mergeFromInputStream:input] build];
} }
+ (OWSFingerprintProtosFingerprintData*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + (OWSFingerprintProtosLogicalFingerprint*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSFingerprintProtosFingerprintData*)[[[OWSFingerprintProtosFingerprintData builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; return (OWSFingerprintProtosLogicalFingerprint*)[[[OWSFingerprintProtosLogicalFingerprint builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
} }
+ (OWSFingerprintProtosFingerprintData*) parseFromCodedInputStream:(PBCodedInputStream*) input { + (OWSFingerprintProtosLogicalFingerprint*) parseFromCodedInputStream:(PBCodedInputStream*) input {
return (OWSFingerprintProtosFingerprintData*)[[[OWSFingerprintProtosFingerprintData builder] mergeFromCodedInputStream:input] build]; return (OWSFingerprintProtosLogicalFingerprint*)[[[OWSFingerprintProtosLogicalFingerprint builder] mergeFromCodedInputStream:input] build];
} }
+ (OWSFingerprintProtosFingerprintData*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + (OWSFingerprintProtosLogicalFingerprint*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSFingerprintProtosFingerprintData*)[[[OWSFingerprintProtosFingerprintData builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; return (OWSFingerprintProtosLogicalFingerprint*)[[[OWSFingerprintProtosLogicalFingerprint builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
} }
+ (OWSFingerprintProtosFingerprintDataBuilder*) builder { + (OWSFingerprintProtosLogicalFingerprintBuilder*) builder {
return [[OWSFingerprintProtosFingerprintDataBuilder alloc] init]; return [[OWSFingerprintProtosLogicalFingerprintBuilder alloc] init];
} }
+ (OWSFingerprintProtosFingerprintDataBuilder*) builderWithPrototype:(OWSFingerprintProtosFingerprintData*) prototype { + (OWSFingerprintProtosLogicalFingerprintBuilder*) builderWithPrototype:(OWSFingerprintProtosLogicalFingerprint*) prototype {
return [[OWSFingerprintProtosFingerprintData builder] mergeFrom:prototype]; return [[OWSFingerprintProtosLogicalFingerprint builder] mergeFrom:prototype];
} }
- (OWSFingerprintProtosFingerprintDataBuilder*) builder { - (OWSFingerprintProtosLogicalFingerprintBuilder*) builder {
return [OWSFingerprintProtosFingerprintData builder]; return [OWSFingerprintProtosLogicalFingerprint builder];
} }
- (OWSFingerprintProtosFingerprintDataBuilder*) toBuilder { - (OWSFingerprintProtosLogicalFingerprintBuilder*) toBuilder {
return [OWSFingerprintProtosFingerprintData builderWithPrototype:self]; return [OWSFingerprintProtosLogicalFingerprint builderWithPrototype:self];
} }
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent { - (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
if (self.hasPublicKey) { if (self.hasIdentityData) {
[output appendFormat:@"%@%@: %@\n", indent, @"publicKey", self.publicKey]; [output appendFormat:@"%@%@: %@\n", indent, @"identityData", self.identityData];
}
if (self.hasIdentifier) {
[output appendFormat:@"%@%@: %@\n", indent, @"identifier", self.identifier];
} }
[self.unknownFields writeDescriptionTo:output withIndent:indent]; [self.unknownFields writeDescriptionTo:output withIndent:indent];
} }
- (void) storeInDictionary:(NSMutableDictionary *)dictionary { - (void) storeInDictionary:(NSMutableDictionary *)dictionary {
if (self.hasPublicKey) { if (self.hasIdentityData) {
[dictionary setObject: self.publicKey forKey: @"publicKey"]; [dictionary setObject: self.identityData forKey: @"identityData"];
}
if (self.hasIdentifier) {
[dictionary setObject: self.identifier forKey: @"identifier"];
} }
[self.unknownFields storeInDictionary:dictionary]; [self.unknownFields storeInDictionary:dictionary];
} }
@ -142,81 +121,73 @@ static OWSFingerprintProtosFingerprintData* defaultOWSFingerprintProtosFingerpri
if (other == self) { if (other == self) {
return YES; return YES;
} }
if (![other isKindOfClass:[OWSFingerprintProtosFingerprintData class]]) { if (![other isKindOfClass:[OWSFingerprintProtosLogicalFingerprint class]]) {
return NO; return NO;
} }
OWSFingerprintProtosFingerprintData *otherMessage = other; OWSFingerprintProtosLogicalFingerprint *otherMessage = other;
return return
self.hasPublicKey == otherMessage.hasPublicKey && self.hasIdentityData == otherMessage.hasIdentityData &&
(!self.hasPublicKey || [self.publicKey isEqual:otherMessage.publicKey]) && (!self.hasIdentityData || [self.identityData isEqual:otherMessage.identityData]) &&
self.hasIdentifier == otherMessage.hasIdentifier &&
(!self.hasIdentifier || [self.identifier isEqual:otherMessage.identifier]) &&
(self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
} }
- (NSUInteger) hash { - (NSUInteger) hash {
__block NSUInteger hashCode = 7; __block NSUInteger hashCode = 7;
if (self.hasPublicKey) { if (self.hasIdentityData) {
hashCode = hashCode * 31 + [self.publicKey hash]; hashCode = hashCode * 31 + [self.identityData hash];
}
if (self.hasIdentifier) {
hashCode = hashCode * 31 + [self.identifier hash];
} }
hashCode = hashCode * 31 + [self.unknownFields hash]; hashCode = hashCode * 31 + [self.unknownFields hash];
return hashCode; return hashCode;
} }
@end @end
@interface OWSFingerprintProtosFingerprintDataBuilder() @interface OWSFingerprintProtosLogicalFingerprintBuilder()
@property (strong) OWSFingerprintProtosFingerprintData* resultFingerprintData; @property (strong) OWSFingerprintProtosLogicalFingerprint* resultLogicalFingerprint;
@end @end
@implementation OWSFingerprintProtosFingerprintDataBuilder @implementation OWSFingerprintProtosLogicalFingerprintBuilder
@synthesize resultFingerprintData; @synthesize resultLogicalFingerprint;
- (instancetype) init { - (instancetype) init {
if ((self = [super init])) { if ((self = [super init])) {
self.resultFingerprintData = [[OWSFingerprintProtosFingerprintData alloc] init]; self.resultLogicalFingerprint = [[OWSFingerprintProtosLogicalFingerprint alloc] init];
} }
return self; return self;
} }
- (PBGeneratedMessage*) internalGetResult { - (PBGeneratedMessage*) internalGetResult {
return resultFingerprintData; return resultLogicalFingerprint;
} }
- (OWSFingerprintProtosFingerprintDataBuilder*) clear { - (OWSFingerprintProtosLogicalFingerprintBuilder*) clear {
self.resultFingerprintData = [[OWSFingerprintProtosFingerprintData alloc] init]; self.resultLogicalFingerprint = [[OWSFingerprintProtosLogicalFingerprint alloc] init];
return self; return self;
} }
- (OWSFingerprintProtosFingerprintDataBuilder*) clone { - (OWSFingerprintProtosLogicalFingerprintBuilder*) clone {
return [OWSFingerprintProtosFingerprintData builderWithPrototype:resultFingerprintData]; return [OWSFingerprintProtosLogicalFingerprint builderWithPrototype:resultLogicalFingerprint];
} }
- (OWSFingerprintProtosFingerprintData*) defaultInstance { - (OWSFingerprintProtosLogicalFingerprint*) defaultInstance {
return [OWSFingerprintProtosFingerprintData defaultInstance]; return [OWSFingerprintProtosLogicalFingerprint defaultInstance];
} }
- (OWSFingerprintProtosFingerprintData*) build { - (OWSFingerprintProtosLogicalFingerprint*) build {
[self checkInitialized]; [self checkInitialized];
return [self buildPartial]; return [self buildPartial];
} }
- (OWSFingerprintProtosFingerprintData*) buildPartial { - (OWSFingerprintProtosLogicalFingerprint*) buildPartial {
OWSFingerprintProtosFingerprintData* returnMe = resultFingerprintData; OWSFingerprintProtosLogicalFingerprint* returnMe = resultLogicalFingerprint;
self.resultFingerprintData = nil; self.resultLogicalFingerprint = nil;
return returnMe; return returnMe;
} }
- (OWSFingerprintProtosFingerprintDataBuilder*) mergeFrom:(OWSFingerprintProtosFingerprintData*) other { - (OWSFingerprintProtosLogicalFingerprintBuilder*) mergeFrom:(OWSFingerprintProtosLogicalFingerprint*) other {
if (other == [OWSFingerprintProtosFingerprintData defaultInstance]) { if (other == [OWSFingerprintProtosLogicalFingerprint defaultInstance]) {
return self; return self;
} }
if (other.hasPublicKey) { if (other.hasIdentityData) {
[self setPublicKey:other.publicKey]; [self setIdentityData:other.identityData];
}
if (other.hasIdentifier) {
[self setIdentifier:other.identifier];
} }
[self mergeUnknownFields:other.unknownFields]; [self mergeUnknownFields:other.unknownFields];
return self; return self;
} }
- (OWSFingerprintProtosFingerprintDataBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input { - (OWSFingerprintProtosLogicalFingerprintBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
} }
- (OWSFingerprintProtosFingerprintDataBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { - (OWSFingerprintProtosLogicalFingerprintBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
while (YES) { while (YES) {
SInt32 tag = [input readTag]; SInt32 tag = [input readTag];
@ -232,57 +203,37 @@ static OWSFingerprintProtosFingerprintData* defaultOWSFingerprintProtosFingerpri
break; break;
} }
case 10: { case 10: {
[self setPublicKey:[input readData]]; [self setIdentityData:[input readData]];
break;
}
case 18: {
[self setIdentifier:[input readData]];
break; break;
} }
} }
} }
} }
- (BOOL) hasPublicKey { - (BOOL) hasIdentityData {
return resultFingerprintData.hasPublicKey; return resultLogicalFingerprint.hasIdentityData;
}
- (NSData*) publicKey {
return resultFingerprintData.publicKey;
}
- (OWSFingerprintProtosFingerprintDataBuilder*) setPublicKey:(NSData*) value {
resultFingerprintData.hasPublicKey = YES;
resultFingerprintData.publicKey = value;
return self;
}
- (OWSFingerprintProtosFingerprintDataBuilder*) clearPublicKey {
resultFingerprintData.hasPublicKey = NO;
resultFingerprintData.publicKey = [NSData data];
return self;
}
- (BOOL) hasIdentifier {
return resultFingerprintData.hasIdentifier;
} }
- (NSData*) identifier { - (NSData*) identityData {
return resultFingerprintData.identifier; return resultLogicalFingerprint.identityData;
} }
- (OWSFingerprintProtosFingerprintDataBuilder*) setIdentifier:(NSData*) value { - (OWSFingerprintProtosLogicalFingerprintBuilder*) setIdentityData:(NSData*) value {
resultFingerprintData.hasIdentifier = YES; resultLogicalFingerprint.hasIdentityData = YES;
resultFingerprintData.identifier = value; resultLogicalFingerprint.identityData = value;
return self; return self;
} }
- (OWSFingerprintProtosFingerprintDataBuilder*) clearIdentifier { - (OWSFingerprintProtosLogicalFingerprintBuilder*) clearIdentityData {
resultFingerprintData.hasIdentifier = NO; resultLogicalFingerprint.hasIdentityData = NO;
resultFingerprintData.identifier = [NSData data]; resultLogicalFingerprint.identityData = [NSData data];
return self; return self;
} }
@end @end
@interface OWSFingerprintProtosCombinedFingerprint () @interface OWSFingerprintProtosLogicalFingerprints ()
@property UInt32 version; @property UInt32 version;
@property (strong) OWSFingerprintProtosFingerprintData* localFingerprint; @property (strong) OWSFingerprintProtosLogicalFingerprint* localFingerprint;
@property (strong) OWSFingerprintProtosFingerprintData* remoteFingerprint; @property (strong) OWSFingerprintProtosLogicalFingerprint* remoteFingerprint;
@end @end
@implementation OWSFingerprintProtosCombinedFingerprint @implementation OWSFingerprintProtosLogicalFingerprints
- (BOOL) hasVersion { - (BOOL) hasVersion {
return !!hasVersion_; return !!hasVersion_;
@ -308,22 +259,22 @@ static OWSFingerprintProtosFingerprintData* defaultOWSFingerprintProtosFingerpri
- (instancetype) init { - (instancetype) init {
if ((self = [super init])) { if ((self = [super init])) {
self.version = 0; self.version = 0;
self.localFingerprint = [OWSFingerprintProtosFingerprintData defaultInstance]; self.localFingerprint = [OWSFingerprintProtosLogicalFingerprint defaultInstance];
self.remoteFingerprint = [OWSFingerprintProtosFingerprintData defaultInstance]; self.remoteFingerprint = [OWSFingerprintProtosLogicalFingerprint defaultInstance];
} }
return self; return self;
} }
static OWSFingerprintProtosCombinedFingerprint* defaultOWSFingerprintProtosCombinedFingerprintInstance = nil; static OWSFingerprintProtosLogicalFingerprints* defaultOWSFingerprintProtosLogicalFingerprintsInstance = nil;
+ (void) initialize { + (void) initialize {
if (self == [OWSFingerprintProtosCombinedFingerprint class]) { if (self == [OWSFingerprintProtosLogicalFingerprints class]) {
defaultOWSFingerprintProtosCombinedFingerprintInstance = [[OWSFingerprintProtosCombinedFingerprint alloc] init]; defaultOWSFingerprintProtosLogicalFingerprintsInstance = [[OWSFingerprintProtosLogicalFingerprints alloc] init];
} }
} }
+ (instancetype) defaultInstance { + (instancetype) defaultInstance {
return defaultOWSFingerprintProtosCombinedFingerprintInstance; return defaultOWSFingerprintProtosLogicalFingerprintsInstance;
} }
- (instancetype) defaultInstance { - (instancetype) defaultInstance {
return defaultOWSFingerprintProtosCombinedFingerprintInstance; return defaultOWSFingerprintProtosLogicalFingerprintsInstance;
} }
- (BOOL) isInitialized { - (BOOL) isInitialized {
return YES; return YES;
@ -360,35 +311,35 @@ static OWSFingerprintProtosCombinedFingerprint* defaultOWSFingerprintProtosCombi
memoizedSerializedSize = size_; memoizedSerializedSize = size_;
return size_; return size_;
} }
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromData:(NSData*) data { + (OWSFingerprintProtosLogicalFingerprints*) parseFromData:(NSData*) data {
return (OWSFingerprintProtosCombinedFingerprint*)[[[OWSFingerprintProtosCombinedFingerprint builder] mergeFromData:data] build]; return (OWSFingerprintProtosLogicalFingerprints*)[[[OWSFingerprintProtosLogicalFingerprints builder] mergeFromData:data] build];
} }
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + (OWSFingerprintProtosLogicalFingerprints*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSFingerprintProtosCombinedFingerprint*)[[[OWSFingerprintProtosCombinedFingerprint builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; return (OWSFingerprintProtosLogicalFingerprints*)[[[OWSFingerprintProtosLogicalFingerprints builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
} }
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromInputStream:(NSInputStream*) input { + (OWSFingerprintProtosLogicalFingerprints*) parseFromInputStream:(NSInputStream*) input {
return (OWSFingerprintProtosCombinedFingerprint*)[[[OWSFingerprintProtosCombinedFingerprint builder] mergeFromInputStream:input] build]; return (OWSFingerprintProtosLogicalFingerprints*)[[[OWSFingerprintProtosLogicalFingerprints builder] mergeFromInputStream:input] build];
} }
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + (OWSFingerprintProtosLogicalFingerprints*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSFingerprintProtosCombinedFingerprint*)[[[OWSFingerprintProtosCombinedFingerprint builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; return (OWSFingerprintProtosLogicalFingerprints*)[[[OWSFingerprintProtosLogicalFingerprints builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
} }
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromCodedInputStream:(PBCodedInputStream*) input { + (OWSFingerprintProtosLogicalFingerprints*) parseFromCodedInputStream:(PBCodedInputStream*) input {
return (OWSFingerprintProtosCombinedFingerprint*)[[[OWSFingerprintProtosCombinedFingerprint builder] mergeFromCodedInputStream:input] build]; return (OWSFingerprintProtosLogicalFingerprints*)[[[OWSFingerprintProtosLogicalFingerprints builder] mergeFromCodedInputStream:input] build];
} }
+ (OWSFingerprintProtosCombinedFingerprint*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + (OWSFingerprintProtosLogicalFingerprints*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSFingerprintProtosCombinedFingerprint*)[[[OWSFingerprintProtosCombinedFingerprint builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; return (OWSFingerprintProtosLogicalFingerprints*)[[[OWSFingerprintProtosLogicalFingerprints builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
} }
+ (OWSFingerprintProtosCombinedFingerprintBuilder*) builder { + (OWSFingerprintProtosLogicalFingerprintsBuilder*) builder {
return [[OWSFingerprintProtosCombinedFingerprintBuilder alloc] init]; return [[OWSFingerprintProtosLogicalFingerprintsBuilder alloc] init];
} }
+ (OWSFingerprintProtosCombinedFingerprintBuilder*) builderWithPrototype:(OWSFingerprintProtosCombinedFingerprint*) prototype { + (OWSFingerprintProtosLogicalFingerprintsBuilder*) builderWithPrototype:(OWSFingerprintProtosLogicalFingerprints*) prototype {
return [[OWSFingerprintProtosCombinedFingerprint builder] mergeFrom:prototype]; return [[OWSFingerprintProtosLogicalFingerprints builder] mergeFrom:prototype];
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) builder { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) builder {
return [OWSFingerprintProtosCombinedFingerprint builder]; return [OWSFingerprintProtosLogicalFingerprints builder];
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) toBuilder { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) toBuilder {
return [OWSFingerprintProtosCombinedFingerprint builderWithPrototype:self]; return [OWSFingerprintProtosLogicalFingerprints builderWithPrototype:self];
} }
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent { - (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
if (self.hasVersion) { if (self.hasVersion) {
@ -428,10 +379,10 @@ static OWSFingerprintProtosCombinedFingerprint* defaultOWSFingerprintProtosCombi
if (other == self) { if (other == self) {
return YES; return YES;
} }
if (![other isKindOfClass:[OWSFingerprintProtosCombinedFingerprint class]]) { if (![other isKindOfClass:[OWSFingerprintProtosLogicalFingerprints class]]) {
return NO; return NO;
} }
OWSFingerprintProtosCombinedFingerprint *otherMessage = other; OWSFingerprintProtosLogicalFingerprints *otherMessage = other;
return return
self.hasVersion == otherMessage.hasVersion && self.hasVersion == otherMessage.hasVersion &&
(!self.hasVersion || self.version == otherMessage.version) && (!self.hasVersion || self.version == otherMessage.version) &&
@ -457,42 +408,42 @@ static OWSFingerprintProtosCombinedFingerprint* defaultOWSFingerprintProtosCombi
} }
@end @end
@interface OWSFingerprintProtosCombinedFingerprintBuilder() @interface OWSFingerprintProtosLogicalFingerprintsBuilder()
@property (strong) OWSFingerprintProtosCombinedFingerprint* resultCombinedFingerprint; @property (strong) OWSFingerprintProtosLogicalFingerprints* resultLogicalFingerprints;
@end @end
@implementation OWSFingerprintProtosCombinedFingerprintBuilder @implementation OWSFingerprintProtosLogicalFingerprintsBuilder
@synthesize resultCombinedFingerprint; @synthesize resultLogicalFingerprints;
- (instancetype) init { - (instancetype) init {
if ((self = [super init])) { if ((self = [super init])) {
self.resultCombinedFingerprint = [[OWSFingerprintProtosCombinedFingerprint alloc] init]; self.resultLogicalFingerprints = [[OWSFingerprintProtosLogicalFingerprints alloc] init];
} }
return self; return self;
} }
- (PBGeneratedMessage*) internalGetResult { - (PBGeneratedMessage*) internalGetResult {
return resultCombinedFingerprint; return resultLogicalFingerprints;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) clear { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) clear {
self.resultCombinedFingerprint = [[OWSFingerprintProtosCombinedFingerprint alloc] init]; self.resultLogicalFingerprints = [[OWSFingerprintProtosLogicalFingerprints alloc] init];
return self; return self;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) clone { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) clone {
return [OWSFingerprintProtosCombinedFingerprint builderWithPrototype:resultCombinedFingerprint]; return [OWSFingerprintProtosLogicalFingerprints builderWithPrototype:resultLogicalFingerprints];
} }
- (OWSFingerprintProtosCombinedFingerprint*) defaultInstance { - (OWSFingerprintProtosLogicalFingerprints*) defaultInstance {
return [OWSFingerprintProtosCombinedFingerprint defaultInstance]; return [OWSFingerprintProtosLogicalFingerprints defaultInstance];
} }
- (OWSFingerprintProtosCombinedFingerprint*) build { - (OWSFingerprintProtosLogicalFingerprints*) build {
[self checkInitialized]; [self checkInitialized];
return [self buildPartial]; return [self buildPartial];
} }
- (OWSFingerprintProtosCombinedFingerprint*) buildPartial { - (OWSFingerprintProtosLogicalFingerprints*) buildPartial {
OWSFingerprintProtosCombinedFingerprint* returnMe = resultCombinedFingerprint; OWSFingerprintProtosLogicalFingerprints* returnMe = resultLogicalFingerprints;
self.resultCombinedFingerprint = nil; self.resultLogicalFingerprints = nil;
return returnMe; return returnMe;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) mergeFrom:(OWSFingerprintProtosCombinedFingerprint*) other { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) mergeFrom:(OWSFingerprintProtosLogicalFingerprints*) other {
if (other == [OWSFingerprintProtosCombinedFingerprint defaultInstance]) { if (other == [OWSFingerprintProtosLogicalFingerprints defaultInstance]) {
return self; return self;
} }
if (other.hasVersion) { if (other.hasVersion) {
@ -507,10 +458,10 @@ static OWSFingerprintProtosCombinedFingerprint* defaultOWSFingerprintProtosCombi
[self mergeUnknownFields:other.unknownFields]; [self mergeUnknownFields:other.unknownFields];
return self; return self;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
while (YES) { while (YES) {
SInt32 tag = [input readTag]; SInt32 tag = [input readTag];
@ -530,7 +481,7 @@ static OWSFingerprintProtosCombinedFingerprint* defaultOWSFingerprintProtosCombi
break; break;
} }
case 18: { case 18: {
OWSFingerprintProtosFingerprintDataBuilder* subBuilder = [OWSFingerprintProtosFingerprintData builder]; OWSFingerprintProtosLogicalFingerprintBuilder* subBuilder = [OWSFingerprintProtosLogicalFingerprint builder];
if (self.hasLocalFingerprint) { if (self.hasLocalFingerprint) {
[subBuilder mergeFrom:self.localFingerprint]; [subBuilder mergeFrom:self.localFingerprint];
} }
@ -539,7 +490,7 @@ static OWSFingerprintProtosCombinedFingerprint* defaultOWSFingerprintProtosCombi
break; break;
} }
case 26: { case 26: {
OWSFingerprintProtosFingerprintDataBuilder* subBuilder = [OWSFingerprintProtosFingerprintData builder]; OWSFingerprintProtosLogicalFingerprintBuilder* subBuilder = [OWSFingerprintProtosLogicalFingerprint builder];
if (self.hasRemoteFingerprint) { if (self.hasRemoteFingerprint) {
[subBuilder mergeFrom:self.remoteFingerprint]; [subBuilder mergeFrom:self.remoteFingerprint];
} }
@ -551,79 +502,79 @@ static OWSFingerprintProtosCombinedFingerprint* defaultOWSFingerprintProtosCombi
} }
} }
- (BOOL) hasVersion { - (BOOL) hasVersion {
return resultCombinedFingerprint.hasVersion; return resultLogicalFingerprints.hasVersion;
} }
- (UInt32) version { - (UInt32) version {
return resultCombinedFingerprint.version; return resultLogicalFingerprints.version;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) setVersion:(UInt32) value { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) setVersion:(UInt32) value {
resultCombinedFingerprint.hasVersion = YES; resultLogicalFingerprints.hasVersion = YES;
resultCombinedFingerprint.version = value; resultLogicalFingerprints.version = value;
return self; return self;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) clearVersion { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) clearVersion {
resultCombinedFingerprint.hasVersion = NO; resultLogicalFingerprints.hasVersion = NO;
resultCombinedFingerprint.version = 0; resultLogicalFingerprints.version = 0;
return self; return self;
} }
- (BOOL) hasLocalFingerprint { - (BOOL) hasLocalFingerprint {
return resultCombinedFingerprint.hasLocalFingerprint; return resultLogicalFingerprints.hasLocalFingerprint;
} }
- (OWSFingerprintProtosFingerprintData*) localFingerprint { - (OWSFingerprintProtosLogicalFingerprint*) localFingerprint {
return resultCombinedFingerprint.localFingerprint; return resultLogicalFingerprints.localFingerprint;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) setLocalFingerprint:(OWSFingerprintProtosFingerprintData*) value { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) setLocalFingerprint:(OWSFingerprintProtosLogicalFingerprint*) value {
resultCombinedFingerprint.hasLocalFingerprint = YES; resultLogicalFingerprints.hasLocalFingerprint = YES;
resultCombinedFingerprint.localFingerprint = value; resultLogicalFingerprints.localFingerprint = value;
return self; return self;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) setLocalFingerprintBuilder:(OWSFingerprintProtosFingerprintDataBuilder*) builderForValue { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) setLocalFingerprintBuilder:(OWSFingerprintProtosLogicalFingerprintBuilder*) builderForValue {
return [self setLocalFingerprint:[builderForValue build]]; return [self setLocalFingerprint:[builderForValue build]];
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) mergeLocalFingerprint:(OWSFingerprintProtosFingerprintData*) value { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) mergeLocalFingerprint:(OWSFingerprintProtosLogicalFingerprint*) value {
if (resultCombinedFingerprint.hasLocalFingerprint && if (resultLogicalFingerprints.hasLocalFingerprint &&
resultCombinedFingerprint.localFingerprint != [OWSFingerprintProtosFingerprintData defaultInstance]) { resultLogicalFingerprints.localFingerprint != [OWSFingerprintProtosLogicalFingerprint defaultInstance]) {
resultCombinedFingerprint.localFingerprint = resultLogicalFingerprints.localFingerprint =
[[[OWSFingerprintProtosFingerprintData builderWithPrototype:resultCombinedFingerprint.localFingerprint] mergeFrom:value] buildPartial]; [[[OWSFingerprintProtosLogicalFingerprint builderWithPrototype:resultLogicalFingerprints.localFingerprint] mergeFrom:value] buildPartial];
} else { } else {
resultCombinedFingerprint.localFingerprint = value; resultLogicalFingerprints.localFingerprint = value;
} }
resultCombinedFingerprint.hasLocalFingerprint = YES; resultLogicalFingerprints.hasLocalFingerprint = YES;
return self; return self;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) clearLocalFingerprint { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) clearLocalFingerprint {
resultCombinedFingerprint.hasLocalFingerprint = NO; resultLogicalFingerprints.hasLocalFingerprint = NO;
resultCombinedFingerprint.localFingerprint = [OWSFingerprintProtosFingerprintData defaultInstance]; resultLogicalFingerprints.localFingerprint = [OWSFingerprintProtosLogicalFingerprint defaultInstance];
return self; return self;
} }
- (BOOL) hasRemoteFingerprint { - (BOOL) hasRemoteFingerprint {
return resultCombinedFingerprint.hasRemoteFingerprint; return resultLogicalFingerprints.hasRemoteFingerprint;
} }
- (OWSFingerprintProtosFingerprintData*) remoteFingerprint { - (OWSFingerprintProtosLogicalFingerprint*) remoteFingerprint {
return resultCombinedFingerprint.remoteFingerprint; return resultLogicalFingerprints.remoteFingerprint;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) setRemoteFingerprint:(OWSFingerprintProtosFingerprintData*) value { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) setRemoteFingerprint:(OWSFingerprintProtosLogicalFingerprint*) value {
resultCombinedFingerprint.hasRemoteFingerprint = YES; resultLogicalFingerprints.hasRemoteFingerprint = YES;
resultCombinedFingerprint.remoteFingerprint = value; resultLogicalFingerprints.remoteFingerprint = value;
return self; return self;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) setRemoteFingerprintBuilder:(OWSFingerprintProtosFingerprintDataBuilder*) builderForValue { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) setRemoteFingerprintBuilder:(OWSFingerprintProtosLogicalFingerprintBuilder*) builderForValue {
return [self setRemoteFingerprint:[builderForValue build]]; return [self setRemoteFingerprint:[builderForValue build]];
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) mergeRemoteFingerprint:(OWSFingerprintProtosFingerprintData*) value { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) mergeRemoteFingerprint:(OWSFingerprintProtosLogicalFingerprint*) value {
if (resultCombinedFingerprint.hasRemoteFingerprint && if (resultLogicalFingerprints.hasRemoteFingerprint &&
resultCombinedFingerprint.remoteFingerprint != [OWSFingerprintProtosFingerprintData defaultInstance]) { resultLogicalFingerprints.remoteFingerprint != [OWSFingerprintProtosLogicalFingerprint defaultInstance]) {
resultCombinedFingerprint.remoteFingerprint = resultLogicalFingerprints.remoteFingerprint =
[[[OWSFingerprintProtosFingerprintData builderWithPrototype:resultCombinedFingerprint.remoteFingerprint] mergeFrom:value] buildPartial]; [[[OWSFingerprintProtosLogicalFingerprint builderWithPrototype:resultLogicalFingerprints.remoteFingerprint] mergeFrom:value] buildPartial];
} else { } else {
resultCombinedFingerprint.remoteFingerprint = value; resultLogicalFingerprints.remoteFingerprint = value;
} }
resultCombinedFingerprint.hasRemoteFingerprint = YES; resultLogicalFingerprints.hasRemoteFingerprint = YES;
return self; return self;
} }
- (OWSFingerprintProtosCombinedFingerprintBuilder*) clearRemoteFingerprint { - (OWSFingerprintProtosLogicalFingerprintsBuilder*) clearRemoteFingerprint {
resultCombinedFingerprint.hasRemoteFingerprint = NO; resultLogicalFingerprints.hasRemoteFingerprint = NO;
resultCombinedFingerprint.remoteFingerprint = [OWSFingerprintProtosFingerprintData defaultInstance]; resultLogicalFingerprints.remoteFingerprint = [OWSFingerprintProtosLogicalFingerprint defaultInstance];
return self; return self;
} }
@end @end

@ -23,6 +23,7 @@
myIdentityKey:aliceIdentityKey myIdentityKey:aliceIdentityKey
theirStableId:bobStableId theirStableId:bobStableId
theirIdentityKey:bobIdentityKey theirIdentityKey:bobIdentityKey
theirName:@"Bob"
hashIterations:2]; hashIterations:2];
NSString *displayableText = aliceFingerprint.displayableText; NSString *displayableText = aliceFingerprint.displayableText;
@ -53,18 +54,21 @@
myIdentityKey:aliceIdentityKey myIdentityKey:aliceIdentityKey
theirStableId:bobStableId theirStableId:bobStableId
theirIdentityKey:bobIdentityKey theirIdentityKey:bobIdentityKey
theirName:@"Bob"
hashIterations:2]; hashIterations:2];
OWSFingerprint *bobFingerprint = [OWSFingerprint fingerprintWithMyStableId:bobStableId OWSFingerprint *bobFingerprint = [OWSFingerprint fingerprintWithMyStableId:bobStableId
myIdentityKey:bobIdentityKey myIdentityKey:bobIdentityKey
theirStableId:aliceStableId theirStableId:aliceStableId
theirIdentityKey:aliceIdentityKey theirIdentityKey:aliceIdentityKey
theirName:@"Alice"
hashIterations:2]; hashIterations:2];
OWSFingerprint *charlieFingerprint = [OWSFingerprint fingerprintWithMyStableId:charlieStableId OWSFingerprint *charlieFingerprint = [OWSFingerprint fingerprintWithMyStableId:charlieStableId
myIdentityKey:charlieIdentityKey myIdentityKey:charlieIdentityKey
theirStableId:aliceStableId theirStableId:aliceStableId
theirIdentityKey:aliceIdentityKey theirIdentityKey:aliceIdentityKey
theirName:@"Alice"
hashIterations:2]; hashIterations:2];
XCTAssertEqualObjects(aliceFingerprint.displayableText, bobFingerprint.displayableText); XCTAssertEqualObjects(aliceFingerprint.displayableText, bobFingerprint.displayableText);

Loading…
Cancel
Save