Device provisioning

// FREEBIE
This commit is contained in:
Michael Kirk 2016-08-19 15:36:24 -04:00
parent 6ec21ade9b
commit 9093be2b0d
24 changed files with 1576 additions and 8 deletions

View File

@ -21,6 +21,7 @@
459850C11D22C6F2006FFEDB /* PhoneNumberTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 459850C01D22C6F2006FFEDB /* PhoneNumberTest.m */; };
45A856AC1D220BFF0056CD4D /* TSAttributesTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 45A856AB1D220BFF0056CD4D /* TSAttributesTest.m */; };
45C6A09A1D2F029B007D8AC0 /* TSMessageTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 45C6A0991D2F029B007D8AC0 /* TSMessageTest.m */; };
45D7243F1D67899F00E0CA54 /* OWSDeviceProvisionerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 45D7243E1D67899F00E0CA54 /* OWSDeviceProvisionerTest.m */; };
51520592F83F2440F2DE4D67 /* libPods-TSKitiOSTestApp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B8362AB8E280E0F64352F08A /* libPods-TSKitiOSTestApp.a */; };
B6273DD61C13A2E500738558 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B6273DD51C13A2E500738558 /* main.m */; };
B6273DD91C13A2E500738558 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B6273DD81C13A2E500738558 /* AppDelegate.m */; };
@ -58,6 +59,7 @@
459FE0DA1D4AD49E00E1071A /* TSKitiOSTestApp-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "TSKitiOSTestApp-Prefix.pch"; sourceTree = "<group>"; };
45A856AB1D220BFF0056CD4D /* TSAttributesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSAttributesTest.m; sourceTree = "<group>"; };
45C6A0991D2F029B007D8AC0 /* TSMessageTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TSMessageTest.m; path = ../../../tests/Messages/Interactions/TSMessageTest.m; sourceTree = "<group>"; };
45D7243E1D67899F00E0CA54 /* OWSDeviceProvisionerTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSDeviceProvisionerTest.m; path = ../../../tests/Devices/OWSDeviceProvisionerTest.m; sourceTree = "<group>"; };
B6273DD11C13A2E500738558 /* TSKitiOSTestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TSKitiOSTestApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
B6273DD51C13A2E500738558 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
B6273DD71C13A2E500738558 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
@ -162,6 +164,14 @@
name = Interactions;
sourceTree = "<group>";
};
45D7243D1D67894100E0CA54 /* Devices */ = {
isa = PBXGroup;
children = (
45D7243E1D67899F00E0CA54 /* OWSDeviceProvisionerTest.m */,
);
name = Devices;
sourceTree = "<group>";
};
5183572EFCE99F6F1791272A /* Pods */ = {
isa = PBXGroup;
children = (
@ -230,10 +240,11 @@
B6273DED1C13A2E500738558 /* TSKitiOSTestAppTests */ = {
isa = PBXGroup;
children = (
45C6A0971D2F0254007D8AC0 /* Messages */,
45458B691CC342B600A02153 /* Account */,
45458B6B1CC342B600A02153 /* Attachments */,
459850BF1D22C6C4006FFEDB /* Contacts */,
45D7243D1D67894100E0CA54 /* Devices */,
45C6A0971D2F0254007D8AC0 /* Messages */,
45458B6D1CC342B600A02153 /* Storage */,
45458B721CC342B600A02153 /* Util */,
B6273DF01C13A2E500738558 /* Info.plist */,
@ -453,6 +464,7 @@
45458B781CC342B600A02153 /* TSStorageIdentityKeyStoreTests.m in Sources */,
45458B751CC342B600A02153 /* SignedPreKeyDeletionTests.m in Sources */,
45458B7B1CC342B600A02153 /* CryptographyTests.m in Sources */,
45D7243F1D67899F00E0CA54 /* OWSDeviceProvisionerTest.m in Sources */,
45458B791CC342B600A02153 /* TSStoragePreKeyStoreTests.m in Sources */,
452EE6D51D4AC43300E934BA /* OWSOrphanedDataCleanerTest.m in Sources */,
452EE6CF1D4A754C00E934BA /* TSThreadTest.m in Sources */,

View File

@ -1,9 +1,23 @@
# Assumes you've installed protobug-objc
# see: https://github.com/alexeyxo/protobuf-objc
all: signal_service_proto provisioning_protos
signal_service_proto:
protoc --objc_out=../src/Messages/ \
protoc \
--plugin=/usr/local/bin/proto-gen-objc \
--proto_path="${HOME}/src/WhisperSystems/protobuf-objc/src/compiler/" \
--proto_path="${HOME}/src/WhisperSystems/protobuf-objc/src/compiler/google/protobuf/" \
--proto_path='./' \
--objc_out=../src/Messages/ \
OWSSignalServiceProtos.proto
provisioning_protos:
protoc \
--plugin=/usr/local/bin/proto-gen-objc \
--proto_path="${HOME}/src/WhisperSystems/protobuf-objc/src/compiler/" \
--proto_path="${HOME}/src/WhisperSystems/protobuf-objc/src/compiler/google/protobuf/" \
--proto_path='./' \
--objc_out=../src/Devices/ \
OWSProvisioningProtos.proto

View File

@ -0,0 +1,19 @@
package signalservice;
option java_package = "org.whispersystems.signalservice.internal.push";
option java_outer_classname = "ProvisioningProtos";
import "objectivec-descriptor.proto";
option (google.protobuf.objectivec_file_options).class_prefix = "OWSProvisioningProtos";
message ProvisionEnvelope {
optional bytes publicKey = 1;
optional bytes body = 2; // Encrypted ProvisionMessage
}
message ProvisionMessage {
optional bytes identityKeyPublic = 1;
optional bytes identityKeyPrivate = 2;
optional string number = 3;
optional string provisioningCode = 4;
}

View File

@ -0,0 +1,30 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
NS_ASSUME_NONNULL_BEGIN
@class OWSDeviceProvisioningCodeService;
@class OWSDeviceProvisioningService;
@interface OWSDeviceProvisioner : NSObject
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithMyPublicKey:(NSData *)myPublicKey
myPrivateKey:(NSData *)myPrivateKey
theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier
provisioningCodeService:(OWSDeviceProvisioningCodeService *)provisioningCodeService
provisioningService:(OWSDeviceProvisioningService *)provisioningService NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithMyPublicKey:(NSData *)myPublicKey
myPrivateKey:(NSData *)myPrivateKey
theirPublicKey:(NSData *)theirEncodedPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier;
- (void)provisionWithSuccess:(void (^)())successCallback failure:(void (^)(NSError *))failureCallback;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,99 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
#import "OWSDeviceProvisioner.h"
#import "OWSDeviceProvisioningCodeService.h"
#import "OWSDeviceProvisioningService.h"
#import "OWSProvisioningMessage.h"
NS_ASSUME_NONNULL_BEGIN
@interface OWSDeviceProvisioner ()
@property (nonatomic, readonly) NSData *myPublicKey;
@property (nonatomic, readonly) NSData *myPrivateKey;
@property (nonatomic, readonly) NSData *theirPublicKey;
@property (nonatomic, readonly) NSString *accountIdentifier;
@property (nonatomic, nullable) NSString *ephemeralDeviceId;
@property (nonatomic, readonly) OWSDeviceProvisioningCodeService *provisioningCodeService;
@property (nonatomic, readonly) OWSDeviceProvisioningService *provisioningService;
@end
@implementation OWSDeviceProvisioner
- (instancetype)initWithMyPublicKey:(NSData *)myPublicKey
myPrivateKey:(NSData *)myPrivateKey
theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier
provisioningCodeService:(OWSDeviceProvisioningCodeService *)provisioningCodeService
provisioningService:(OWSDeviceProvisioningService *)provisioningService
{
self = [super init];
if (!self) {
return self;
}
_myPublicKey = myPublicKey;
_myPrivateKey = myPrivateKey;
_theirPublicKey = theirPublicKey;
_accountIdentifier = accountIdentifier;
_ephemeralDeviceId = ephemeralDeviceId;
_provisioningCodeService = provisioningCodeService;
_provisioningService = provisioningService;
return self;
}
- (instancetype)initWithMyPublicKey:(NSData *)myPublicKey
myPrivateKey:(NSData *)myPrivateKey
theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier
{
return [self initWithMyPublicKey:myPublicKey
myPrivateKey:myPrivateKey
theirPublicKey:theirPublicKey
theirEphemeralDeviceId:ephemeralDeviceId
accountIdentifier:accountIdentifier
provisioningCodeService:[OWSDeviceProvisioningCodeService new]
provisioningService:[OWSDeviceProvisioningService new]];
}
- (void)provisionWithSuccess:(void (^)())successCallback failure:(void (^)(NSError *_Nonnull))failureCallback
{
[self.provisioningCodeService requestProvisioningCodeWithSuccess:^(NSString *provisioningCode) {
DDLogInfo(@"Retrieved provisioning code.");
[self provisionWithCode:provisioningCode success:successCallback failure:failureCallback];
}
failure:^(NSError *error) {
DDLogError(@"Failed to get provisioning code with error: %@", error);
failureCallback(error);
}];
}
- (void)provisionWithCode:(NSString *)provisioningCode
success:(void (^)())successCallback
failure:(void (^)(NSError *_Nonnull))failureCallback
{
OWSProvisioningMessage *message = [[OWSProvisioningMessage alloc] initWithMyPublicKey:self.myPublicKey
myPrivateKey:self.myPrivateKey
theirPublicKey:self.theirPublicKey
accountIdentifier:self.accountIdentifier
provisioningCode:provisioningCode];
[self.provisioningService provisionWithMessageBody:[message buildEncryptedMessageBody]
ephemeralDeviceId:self.ephemeralDeviceId
success:^{
DDLogInfo(@"ProvisioningService SUCCEEDED");
successCallback();
}
failure:^(NSError *error) {
DDLogError(@"ProvisioningService FAILED with error:%@", error);
failureCallback(error);
}];
}
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,14 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
NS_ASSUME_NONNULL_BEGIN
@interface OWSProvisioningCipher : NSObject
@property (nonatomic, readonly) NSData *ourPublicKey;
- (instancetype)initWithTheirPublicKey:(NSData *)theirPublicKey;
- (NSData *)encrypt:(NSData *)plainText;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,103 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
#import "OWSProvisioningCipher.h"
#import <25519/Curve25519.h>
#import <HKDFKit/HKDFKit.h>
#import <SignalServiceKit/Cryptography.h>
NS_ASSUME_NONNULL_BEGIN
@interface OWSProvisioningCipher ()
@property (nonatomic, readonly) NSData *theirPublicKey;
@property (nonatomic, readonly) ECKeyPair *ourKeyPair;
@end
@implementation OWSProvisioningCipher
- (instancetype)initWithTheirPublicKey:(NSData *)theirPublicKey
{
self = [super init];
if (!self) {
return self;
}
_theirPublicKey = theirPublicKey;
_ourKeyPair = [Curve25519 generateKeyPair];
return self;
}
- (NSData *)ourPublicKey
{
return self.ourKeyPair.publicKey;
}
- (NSData *)encrypt:(NSData *)dataToEncrypt
{
NSData *sharedSecret =
[Curve25519 generateSharedSecretFromPublicKey:self.theirPublicKey andKeyPair:self.ourKeyPair];
NSData *infoData = [@"TextSecure Provisioning Message" dataUsingEncoding:NSASCIIStringEncoding];
NSData *nullSalt = [[NSMutableData dataWithLength:32] copy];
NSData *derivedSecret = [HKDFKit deriveKey:sharedSecret info:infoData salt:nullSalt outputSize:64];
NSData *cipherKey = [derivedSecret subdataWithRange:NSMakeRange(0, 32)];
NSData *macKey = [derivedSecret subdataWithRange:NSMakeRange(32, 32)];
NSAssert(cipherKey.length == 32, @"Cipher Key must be 32 bytes");
NSAssert(macKey.length == 32, @"Mac Key must be 32 bytes");
u_int8_t versionByte[] = { 0x01 };
NSMutableData *message = [NSMutableData dataWithBytes:&versionByte length:1];
NSData *cipherText = [self encrypt:dataToEncrypt withKey:cipherKey];
[message appendData:cipherText];
NSData *mac = [self macForMessage:message withKey:macKey];
[message appendData:mac];
return [message copy];
}
- (NSData *)encrypt:(NSData *)dataToEncrypt withKey:(NSData *)cipherKey
{
NSData *iv = [Cryptography generateRandomBytes:kCCBlockSizeAES128];
// allow space for message + padding any incomplete block
size_t bufferSize = dataToEncrypt.length + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t bytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES,
kCCOptionPKCS7Padding,
cipherKey.bytes,
cipherKey.length,
iv.bytes,
dataToEncrypt.bytes,
dataToEncrypt.length,
buffer,
bufferSize,
&bytesEncrypted);
if (cryptStatus != kCCSuccess) {
DDLogError(@"Encryption failed with status: %d", cryptStatus);
}
NSMutableData *encryptedMessage = [[NSMutableData alloc] initWithData:iv];
[encryptedMessage appendBytes:buffer length:bytesEncrypted];
return [encryptedMessage copy];
}
- (NSData *)macForMessage:(NSData *)message withKey:(NSData *)macKey
{
uint8_t hmacBytes[CC_SHA256_DIGEST_LENGTH] = { 0 };
CCHmac(kCCHmacAlgSHA256, macKey.bytes, macKey.length, message.bytes, message.length, hmacBytes);
return [NSData dataWithBytes:hmacBytes length:CC_SHA256_DIGEST_LENGTH];
}
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,17 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
NS_ASSUME_NONNULL_BEGIN
@interface OWSProvisioningMessage : NSObject
- (instancetype)initWithMyPublicKey:(NSData *)myPublicKey
myPrivateKey:(NSData *)myPrivateKey
theirPublicKey:(NSData *)theirPublicKey
accountIdentifier:(NSString *)accountIdentifier
provisioningCode:(NSString *)provisioningCode;
- (NSData *)buildEncryptedMessageBody;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,67 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
#import "OWSProvisioningMessage.h"
#import "OWSProvisioningCipher.h"
#import "OWSProvisioningProtos.pb.h"
#import <25519/Curve25519.h>
#import <AxolotlKit/NSData+keyVersionByte.h>
#import <HKDFKit/HKDFKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface OWSProvisioningMessage ()
@property (nonatomic, readonly) NSData *myPublicKey;
@property (nonatomic, readonly) NSData *myPrivateKey;
@property (nonatomic, readonly) NSString *accountIdentifier;
@property (nonatomic, readonly) NSData *theirPublicKey;
@property (nonatomic, readonly) NSString *provisioningCode;
@end
@implementation OWSProvisioningMessage
- (instancetype)initWithMyPublicKey:(NSData *)myPublicKey
myPrivateKey:(NSData *)myPrivateKey
theirPublicKey:(NSData *)theirPublicKey
accountIdentifier:(NSString *)accountIdentifier
provisioningCode:(NSString *)provisioningCode
{
self = [super init];
if (!self) {
return self;
}
_myPublicKey = myPublicKey;
_myPrivateKey = myPrivateKey;
_accountIdentifier = accountIdentifier;
_theirPublicKey = theirPublicKey;
_provisioningCode = provisioningCode;
return self;
}
- (NSData *)buildEncryptedMessageBody
{
OWSProvisioningProtosProvisionMessageBuilder *messageBuilder = [OWSProvisioningProtosProvisionMessageBuilder new];
[messageBuilder setIdentityKeyPublic:self.myPublicKey];
[messageBuilder setIdentityKeyPrivate:self.myPrivateKey];
[messageBuilder setNumber:self.accountIdentifier];
[messageBuilder setProvisioningCode:self.provisioningCode];
NSData *plainTextProvisionMessage = [[messageBuilder build] data];
OWSProvisioningCipher *cipher = [[OWSProvisioningCipher alloc] initWithTheirPublicKey:self.theirPublicKey];
NSData *encryptedProvisionMessage = [cipher encrypt:plainTextProvisionMessage];
OWSProvisioningProtosProvisionEnvelopeBuilder *envelopeBuilder = [OWSProvisioningProtosProvisionEnvelopeBuilder new];
// Note that this is a one-time-use *cipher* public key, not our Signal *identity* public key
[envelopeBuilder setPublicKey:[cipher.ourPublicKey prependKeyType]];
[envelopeBuilder setBody:encryptedProvisionMessage];
return [[envelopeBuilder build] data];
}
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,205 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
#import <ProtocolBuffers/ProtocolBuffers.h>
// @@protoc_insertion_point(imports)
@class OWSProvisioningProtosProvisionEnvelope;
@class OWSProvisioningProtosProvisionEnvelopeBuilder;
@class OWSProvisioningProtosProvisionMessage;
@class OWSProvisioningProtosProvisionMessageBuilder;
@class ObjectiveCFileOptions;
@class ObjectiveCFileOptionsBuilder;
@class PBDescriptorProto;
@class PBDescriptorProtoBuilder;
@class PBDescriptorProtoExtensionRange;
@class PBDescriptorProtoExtensionRangeBuilder;
@class PBEnumDescriptorProto;
@class PBEnumDescriptorProtoBuilder;
@class PBEnumOptions;
@class PBEnumOptionsBuilder;
@class PBEnumValueDescriptorProto;
@class PBEnumValueDescriptorProtoBuilder;
@class PBEnumValueOptions;
@class PBEnumValueOptionsBuilder;
@class PBFieldDescriptorProto;
@class PBFieldDescriptorProtoBuilder;
@class PBFieldOptions;
@class PBFieldOptionsBuilder;
@class PBFileDescriptorProto;
@class PBFileDescriptorProtoBuilder;
@class PBFileDescriptorSet;
@class PBFileDescriptorSetBuilder;
@class PBFileOptions;
@class PBFileOptionsBuilder;
@class PBMessageOptions;
@class PBMessageOptionsBuilder;
@class PBMethodDescriptorProto;
@class PBMethodDescriptorProtoBuilder;
@class PBMethodOptions;
@class PBMethodOptionsBuilder;
@class PBOneofDescriptorProto;
@class PBOneofDescriptorProtoBuilder;
@class PBServiceDescriptorProto;
@class PBServiceDescriptorProtoBuilder;
@class PBServiceOptions;
@class PBServiceOptionsBuilder;
@class PBSourceCodeInfo;
@class PBSourceCodeInfoBuilder;
@class PBSourceCodeInfoLocation;
@class PBSourceCodeInfoLocationBuilder;
@class PBUninterpretedOption;
@class PBUninterpretedOptionBuilder;
@class PBUninterpretedOptionNamePart;
@class PBUninterpretedOptionNamePartBuilder;
@interface OWSProvisioningProtosOwsprovisioningProtosRoot : NSObject {
}
+ (PBExtensionRegistry*) extensionRegistry;
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
@end
#define ProvisionEnvelope_publicKey @"publicKey"
#define ProvisionEnvelope_body @"body"
@interface OWSProvisioningProtosProvisionEnvelope : PBGeneratedMessage<GeneratedMessageProtocol> {
@private
BOOL hasPublicKey_:1;
BOOL hasBody_:1;
NSData* publicKey;
NSData* body;
}
- (BOOL) hasPublicKey;
- (BOOL) hasBody;
@property (readonly, strong) NSData* publicKey;
@property (readonly, strong) NSData* body;
+ (instancetype) defaultInstance;
- (instancetype) defaultInstance;
- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) builder;
+ (OWSProvisioningProtosProvisionEnvelopeBuilder*) builder;
+ (OWSProvisioningProtosProvisionEnvelopeBuilder*) builderWithPrototype:(OWSProvisioningProtosProvisionEnvelope*) prototype;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) toBuilder;
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromData:(NSData*) data;
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromInputStream:(NSInputStream*) input;
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end
@interface OWSProvisioningProtosProvisionEnvelopeBuilder : PBGeneratedMessageBuilder {
@private
OWSProvisioningProtosProvisionEnvelope* resultProvisionEnvelope;
}
- (OWSProvisioningProtosProvisionEnvelope*) defaultInstance;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) clear;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) clone;
- (OWSProvisioningProtosProvisionEnvelope*) build;
- (OWSProvisioningProtosProvisionEnvelope*) buildPartial;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) mergeFrom:(OWSProvisioningProtosProvisionEnvelope*) other;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
- (BOOL) hasPublicKey;
- (NSData*) publicKey;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) setPublicKey:(NSData*) value;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) clearPublicKey;
- (BOOL) hasBody;
- (NSData*) body;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) setBody:(NSData*) value;
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) clearBody;
@end
#define ProvisionMessage_identityKeyPublic @"identityKeyPublic"
#define ProvisionMessage_identityKeyPrivate @"identityKeyPrivate"
#define ProvisionMessage_number @"number"
#define ProvisionMessage_provisioningCode @"provisioningCode"
@interface OWSProvisioningProtosProvisionMessage : PBGeneratedMessage<GeneratedMessageProtocol> {
@private
BOOL hasNumber_:1;
BOOL hasProvisioningCode_:1;
BOOL hasIdentityKeyPublic_:1;
BOOL hasIdentityKeyPrivate_:1;
NSString* number;
NSString* provisioningCode;
NSData* identityKeyPublic;
NSData* identityKeyPrivate;
}
- (BOOL) hasIdentityKeyPublic;
- (BOOL) hasIdentityKeyPrivate;
- (BOOL) hasNumber;
- (BOOL) hasProvisioningCode;
@property (readonly, strong) NSData* identityKeyPublic;
@property (readonly, strong) NSData* identityKeyPrivate;
@property (readonly, strong) NSString* number;
@property (readonly, strong) NSString* provisioningCode;
+ (instancetype) defaultInstance;
- (instancetype) defaultInstance;
- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (OWSProvisioningProtosProvisionMessageBuilder*) builder;
+ (OWSProvisioningProtosProvisionMessageBuilder*) builder;
+ (OWSProvisioningProtosProvisionMessageBuilder*) builderWithPrototype:(OWSProvisioningProtosProvisionMessage*) prototype;
- (OWSProvisioningProtosProvisionMessageBuilder*) toBuilder;
+ (OWSProvisioningProtosProvisionMessage*) parseFromData:(NSData*) data;
+ (OWSProvisioningProtosProvisionMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSProvisioningProtosProvisionMessage*) parseFromInputStream:(NSInputStream*) input;
+ (OWSProvisioningProtosProvisionMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSProvisioningProtosProvisionMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (OWSProvisioningProtosProvisionMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end
@interface OWSProvisioningProtosProvisionMessageBuilder : PBGeneratedMessageBuilder {
@private
OWSProvisioningProtosProvisionMessage* resultProvisionMessage;
}
- (OWSProvisioningProtosProvisionMessage*) defaultInstance;
- (OWSProvisioningProtosProvisionMessageBuilder*) clear;
- (OWSProvisioningProtosProvisionMessageBuilder*) clone;
- (OWSProvisioningProtosProvisionMessage*) build;
- (OWSProvisioningProtosProvisionMessage*) buildPartial;
- (OWSProvisioningProtosProvisionMessageBuilder*) mergeFrom:(OWSProvisioningProtosProvisionMessage*) other;
- (OWSProvisioningProtosProvisionMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (OWSProvisioningProtosProvisionMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
- (BOOL) hasIdentityKeyPublic;
- (NSData*) identityKeyPublic;
- (OWSProvisioningProtosProvisionMessageBuilder*) setIdentityKeyPublic:(NSData*) value;
- (OWSProvisioningProtosProvisionMessageBuilder*) clearIdentityKeyPublic;
- (BOOL) hasIdentityKeyPrivate;
- (NSData*) identityKeyPrivate;
- (OWSProvisioningProtosProvisionMessageBuilder*) setIdentityKeyPrivate:(NSData*) value;
- (OWSProvisioningProtosProvisionMessageBuilder*) clearIdentityKeyPrivate;
- (BOOL) hasNumber;
- (NSString*) number;
- (OWSProvisioningProtosProvisionMessageBuilder*) setNumber:(NSString*) value;
- (OWSProvisioningProtosProvisionMessageBuilder*) clearNumber;
- (BOOL) hasProvisioningCode;
- (NSString*) provisioningCode;
- (OWSProvisioningProtosProvisionMessageBuilder*) setProvisioningCode:(NSString*) value;
- (OWSProvisioningProtosProvisionMessageBuilder*) clearProvisioningCode;
@end
// @@protoc_insertion_point(global_scope)

View File

@ -0,0 +1,633 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
#import "OWSProvisioningProtos.pb.h"
// @@protoc_insertion_point(imports)
@implementation OWSProvisioningProtosOwsprovisioningProtosRoot
static PBExtensionRegistry* extensionRegistry = nil;
+ (PBExtensionRegistry*) extensionRegistry {
return extensionRegistry;
}
+ (void) initialize {
if (self == [OWSProvisioningProtosOwsprovisioningProtosRoot class]) {
PBMutableExtensionRegistry* registry = [PBMutableExtensionRegistry registry];
[self registerAllExtensions:registry];
[ObjectivecDescriptorRoot registerAllExtensions:registry];
extensionRegistry = registry;
}
}
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry {
}
@end
@interface OWSProvisioningProtosProvisionEnvelope ()
@property (strong) NSData* publicKey;
@property (strong) NSData* body;
@end
@implementation OWSProvisioningProtosProvisionEnvelope
- (BOOL) hasPublicKey {
return !!hasPublicKey_;
}
- (void) setHasPublicKey:(BOOL) _value_ {
hasPublicKey_ = !!_value_;
}
@synthesize publicKey;
- (BOOL) hasBody {
return !!hasBody_;
}
- (void) setHasBody:(BOOL) _value_ {
hasBody_ = !!_value_;
}
@synthesize body;
- (instancetype) init {
if ((self = [super init])) {
self.publicKey = [NSData data];
self.body = [NSData data];
}
return self;
}
static OWSProvisioningProtosProvisionEnvelope* defaultOWSProvisioningProtosProvisionEnvelopeInstance = nil;
+ (void) initialize {
if (self == [OWSProvisioningProtosProvisionEnvelope class]) {
defaultOWSProvisioningProtosProvisionEnvelopeInstance = [[OWSProvisioningProtosProvisionEnvelope alloc] init];
}
}
+ (instancetype) defaultInstance {
return defaultOWSProvisioningProtosProvisionEnvelopeInstance;
}
- (instancetype) defaultInstance {
return defaultOWSProvisioningProtosProvisionEnvelopeInstance;
}
- (BOOL) isInitialized {
return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
if (self.hasPublicKey) {
[output writeData:1 value:self.publicKey];
}
if (self.hasBody) {
[output writeData:2 value:self.body];
}
[self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
__block SInt32 size_ = memoizedSerializedSize;
if (size_ != -1) {
return size_;
}
size_ = 0;
if (self.hasPublicKey) {
size_ += computeDataSize(1, self.publicKey);
}
if (self.hasBody) {
size_ += computeDataSize(2, self.body);
}
size_ += self.unknownFields.serializedSize;
memoizedSerializedSize = size_;
return size_;
}
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromData:(NSData*) data {
return (OWSProvisioningProtosProvisionEnvelope*)[[[OWSProvisioningProtosProvisionEnvelope builder] mergeFromData:data] build];
}
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSProvisioningProtosProvisionEnvelope*)[[[OWSProvisioningProtosProvisionEnvelope builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromInputStream:(NSInputStream*) input {
return (OWSProvisioningProtosProvisionEnvelope*)[[[OWSProvisioningProtosProvisionEnvelope builder] mergeFromInputStream:input] build];
}
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSProvisioningProtosProvisionEnvelope*)[[[OWSProvisioningProtosProvisionEnvelope builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromCodedInputStream:(PBCodedInputStream*) input {
return (OWSProvisioningProtosProvisionEnvelope*)[[[OWSProvisioningProtosProvisionEnvelope builder] mergeFromCodedInputStream:input] build];
}
+ (OWSProvisioningProtosProvisionEnvelope*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSProvisioningProtosProvisionEnvelope*)[[[OWSProvisioningProtosProvisionEnvelope builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (OWSProvisioningProtosProvisionEnvelopeBuilder*) builder {
return [[OWSProvisioningProtosProvisionEnvelopeBuilder alloc] init];
}
+ (OWSProvisioningProtosProvisionEnvelopeBuilder*) builderWithPrototype:(OWSProvisioningProtosProvisionEnvelope*) prototype {
return [[OWSProvisioningProtosProvisionEnvelope builder] mergeFrom:prototype];
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) builder {
return [OWSProvisioningProtosProvisionEnvelope builder];
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) toBuilder {
return [OWSProvisioningProtosProvisionEnvelope builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
if (self.hasPublicKey) {
[output appendFormat:@"%@%@: %@\n", indent, @"publicKey", self.publicKey];
}
if (self.hasBody) {
[output appendFormat:@"%@%@: %@\n", indent, @"body", self.body];
}
[self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (void) storeInDictionary:(NSMutableDictionary *)dictionary {
if (self.hasPublicKey) {
[dictionary setObject: self.publicKey forKey: @"publicKey"];
}
if (self.hasBody) {
[dictionary setObject: self.body forKey: @"body"];
}
[self.unknownFields storeInDictionary:dictionary];
}
- (BOOL) isEqual:(id)other {
if (other == self) {
return YES;
}
if (![other isKindOfClass:[OWSProvisioningProtosProvisionEnvelope class]]) {
return NO;
}
OWSProvisioningProtosProvisionEnvelope *otherMessage = other;
return
self.hasPublicKey == otherMessage.hasPublicKey &&
(!self.hasPublicKey || [self.publicKey isEqual:otherMessage.publicKey]) &&
self.hasBody == otherMessage.hasBody &&
(!self.hasBody || [self.body isEqual:otherMessage.body]) &&
(self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
__block NSUInteger hashCode = 7;
if (self.hasPublicKey) {
hashCode = hashCode * 31 + [self.publicKey hash];
}
if (self.hasBody) {
hashCode = hashCode * 31 + [self.body hash];
}
hashCode = hashCode * 31 + [self.unknownFields hash];
return hashCode;
}
@end
@interface OWSProvisioningProtosProvisionEnvelopeBuilder()
@property (strong) OWSProvisioningProtosProvisionEnvelope* resultProvisionEnvelope;
@end
@implementation OWSProvisioningProtosProvisionEnvelopeBuilder
@synthesize resultProvisionEnvelope;
- (instancetype) init {
if ((self = [super init])) {
self.resultProvisionEnvelope = [[OWSProvisioningProtosProvisionEnvelope alloc] init];
}
return self;
}
- (PBGeneratedMessage*) internalGetResult {
return resultProvisionEnvelope;
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) clear {
self.resultProvisionEnvelope = [[OWSProvisioningProtosProvisionEnvelope alloc] init];
return self;
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) clone {
return [OWSProvisioningProtosProvisionEnvelope builderWithPrototype:resultProvisionEnvelope];
}
- (OWSProvisioningProtosProvisionEnvelope*) defaultInstance {
return [OWSProvisioningProtosProvisionEnvelope defaultInstance];
}
- (OWSProvisioningProtosProvisionEnvelope*) build {
[self checkInitialized];
return [self buildPartial];
}
- (OWSProvisioningProtosProvisionEnvelope*) buildPartial {
OWSProvisioningProtosProvisionEnvelope* returnMe = resultProvisionEnvelope;
self.resultProvisionEnvelope = nil;
return returnMe;
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) mergeFrom:(OWSProvisioningProtosProvisionEnvelope*) other {
if (other == [OWSProvisioningProtosProvisionEnvelope defaultInstance]) {
return self;
}
if (other.hasPublicKey) {
[self setPublicKey:other.publicKey];
}
if (other.hasBody) {
[self setBody:other.body];
}
[self mergeUnknownFields:other.unknownFields];
return self;
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
while (YES) {
SInt32 tag = [input readTag];
switch (tag) {
case 0:
[self setUnknownFields:[unknownFields build]];
return self;
default: {
if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
[self setUnknownFields:[unknownFields build]];
return self;
}
break;
}
case 10: {
[self setPublicKey:[input readData]];
break;
}
case 18: {
[self setBody:[input readData]];
break;
}
}
}
}
- (BOOL) hasPublicKey {
return resultProvisionEnvelope.hasPublicKey;
}
- (NSData*) publicKey {
return resultProvisionEnvelope.publicKey;
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) setPublicKey:(NSData*) value {
resultProvisionEnvelope.hasPublicKey = YES;
resultProvisionEnvelope.publicKey = value;
return self;
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) clearPublicKey {
resultProvisionEnvelope.hasPublicKey = NO;
resultProvisionEnvelope.publicKey = [NSData data];
return self;
}
- (BOOL) hasBody {
return resultProvisionEnvelope.hasBody;
}
- (NSData*) body {
return resultProvisionEnvelope.body;
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) setBody:(NSData*) value {
resultProvisionEnvelope.hasBody = YES;
resultProvisionEnvelope.body = value;
return self;
}
- (OWSProvisioningProtosProvisionEnvelopeBuilder*) clearBody {
resultProvisionEnvelope.hasBody = NO;
resultProvisionEnvelope.body = [NSData data];
return self;
}
@end
@interface OWSProvisioningProtosProvisionMessage ()
@property (strong) NSData* identityKeyPublic;
@property (strong) NSData* identityKeyPrivate;
@property (strong) NSString* number;
@property (strong) NSString* provisioningCode;
@end
@implementation OWSProvisioningProtosProvisionMessage
- (BOOL) hasIdentityKeyPublic {
return !!hasIdentityKeyPublic_;
}
- (void) setHasIdentityKeyPublic:(BOOL) _value_ {
hasIdentityKeyPublic_ = !!_value_;
}
@synthesize identityKeyPublic;
- (BOOL) hasIdentityKeyPrivate {
return !!hasIdentityKeyPrivate_;
}
- (void) setHasIdentityKeyPrivate:(BOOL) _value_ {
hasIdentityKeyPrivate_ = !!_value_;
}
@synthesize identityKeyPrivate;
- (BOOL) hasNumber {
return !!hasNumber_;
}
- (void) setHasNumber:(BOOL) _value_ {
hasNumber_ = !!_value_;
}
@synthesize number;
- (BOOL) hasProvisioningCode {
return !!hasProvisioningCode_;
}
- (void) setHasProvisioningCode:(BOOL) _value_ {
hasProvisioningCode_ = !!_value_;
}
@synthesize provisioningCode;
- (instancetype) init {
if ((self = [super init])) {
self.identityKeyPublic = [NSData data];
self.identityKeyPrivate = [NSData data];
self.number = @"";
self.provisioningCode = @"";
}
return self;
}
static OWSProvisioningProtosProvisionMessage* defaultOWSProvisioningProtosProvisionMessageInstance = nil;
+ (void) initialize {
if (self == [OWSProvisioningProtosProvisionMessage class]) {
defaultOWSProvisioningProtosProvisionMessageInstance = [[OWSProvisioningProtosProvisionMessage alloc] init];
}
}
+ (instancetype) defaultInstance {
return defaultOWSProvisioningProtosProvisionMessageInstance;
}
- (instancetype) defaultInstance {
return defaultOWSProvisioningProtosProvisionMessageInstance;
}
- (BOOL) isInitialized {
return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
if (self.hasIdentityKeyPublic) {
[output writeData:1 value:self.identityKeyPublic];
}
if (self.hasIdentityKeyPrivate) {
[output writeData:2 value:self.identityKeyPrivate];
}
if (self.hasNumber) {
[output writeString:3 value:self.number];
}
if (self.hasProvisioningCode) {
[output writeString:4 value:self.provisioningCode];
}
[self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
__block SInt32 size_ = memoizedSerializedSize;
if (size_ != -1) {
return size_;
}
size_ = 0;
if (self.hasIdentityKeyPublic) {
size_ += computeDataSize(1, self.identityKeyPublic);
}
if (self.hasIdentityKeyPrivate) {
size_ += computeDataSize(2, self.identityKeyPrivate);
}
if (self.hasNumber) {
size_ += computeStringSize(3, self.number);
}
if (self.hasProvisioningCode) {
size_ += computeStringSize(4, self.provisioningCode);
}
size_ += self.unknownFields.serializedSize;
memoizedSerializedSize = size_;
return size_;
}
+ (OWSProvisioningProtosProvisionMessage*) parseFromData:(NSData*) data {
return (OWSProvisioningProtosProvisionMessage*)[[[OWSProvisioningProtosProvisionMessage builder] mergeFromData:data] build];
}
+ (OWSProvisioningProtosProvisionMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSProvisioningProtosProvisionMessage*)[[[OWSProvisioningProtosProvisionMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (OWSProvisioningProtosProvisionMessage*) parseFromInputStream:(NSInputStream*) input {
return (OWSProvisioningProtosProvisionMessage*)[[[OWSProvisioningProtosProvisionMessage builder] mergeFromInputStream:input] build];
}
+ (OWSProvisioningProtosProvisionMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSProvisioningProtosProvisionMessage*)[[[OWSProvisioningProtosProvisionMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (OWSProvisioningProtosProvisionMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input {
return (OWSProvisioningProtosProvisionMessage*)[[[OWSProvisioningProtosProvisionMessage builder] mergeFromCodedInputStream:input] build];
}
+ (OWSProvisioningProtosProvisionMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
return (OWSProvisioningProtosProvisionMessage*)[[[OWSProvisioningProtosProvisionMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (OWSProvisioningProtosProvisionMessageBuilder*) builder {
return [[OWSProvisioningProtosProvisionMessageBuilder alloc] init];
}
+ (OWSProvisioningProtosProvisionMessageBuilder*) builderWithPrototype:(OWSProvisioningProtosProvisionMessage*) prototype {
return [[OWSProvisioningProtosProvisionMessage builder] mergeFrom:prototype];
}
- (OWSProvisioningProtosProvisionMessageBuilder*) builder {
return [OWSProvisioningProtosProvisionMessage builder];
}
- (OWSProvisioningProtosProvisionMessageBuilder*) toBuilder {
return [OWSProvisioningProtosProvisionMessage builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
if (self.hasIdentityKeyPublic) {
[output appendFormat:@"%@%@: %@\n", indent, @"identityKeyPublic", self.identityKeyPublic];
}
if (self.hasIdentityKeyPrivate) {
[output appendFormat:@"%@%@: %@\n", indent, @"identityKeyPrivate", self.identityKeyPrivate];
}
if (self.hasNumber) {
[output appendFormat:@"%@%@: %@\n", indent, @"number", self.number];
}
if (self.hasProvisioningCode) {
[output appendFormat:@"%@%@: %@\n", indent, @"provisioningCode", self.provisioningCode];
}
[self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (void) storeInDictionary:(NSMutableDictionary *)dictionary {
if (self.hasIdentityKeyPublic) {
[dictionary setObject: self.identityKeyPublic forKey: @"identityKeyPublic"];
}
if (self.hasIdentityKeyPrivate) {
[dictionary setObject: self.identityKeyPrivate forKey: @"identityKeyPrivate"];
}
if (self.hasNumber) {
[dictionary setObject: self.number forKey: @"number"];
}
if (self.hasProvisioningCode) {
[dictionary setObject: self.provisioningCode forKey: @"provisioningCode"];
}
[self.unknownFields storeInDictionary:dictionary];
}
- (BOOL) isEqual:(id)other {
if (other == self) {
return YES;
}
if (![other isKindOfClass:[OWSProvisioningProtosProvisionMessage class]]) {
return NO;
}
OWSProvisioningProtosProvisionMessage *otherMessage = other;
return
self.hasIdentityKeyPublic == otherMessage.hasIdentityKeyPublic &&
(!self.hasIdentityKeyPublic || [self.identityKeyPublic isEqual:otherMessage.identityKeyPublic]) &&
self.hasIdentityKeyPrivate == otherMessage.hasIdentityKeyPrivate &&
(!self.hasIdentityKeyPrivate || [self.identityKeyPrivate isEqual:otherMessage.identityKeyPrivate]) &&
self.hasNumber == otherMessage.hasNumber &&
(!self.hasNumber || [self.number isEqual:otherMessage.number]) &&
self.hasProvisioningCode == otherMessage.hasProvisioningCode &&
(!self.hasProvisioningCode || [self.provisioningCode isEqual:otherMessage.provisioningCode]) &&
(self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
__block NSUInteger hashCode = 7;
if (self.hasIdentityKeyPublic) {
hashCode = hashCode * 31 + [self.identityKeyPublic hash];
}
if (self.hasIdentityKeyPrivate) {
hashCode = hashCode * 31 + [self.identityKeyPrivate hash];
}
if (self.hasNumber) {
hashCode = hashCode * 31 + [self.number hash];
}
if (self.hasProvisioningCode) {
hashCode = hashCode * 31 + [self.provisioningCode hash];
}
hashCode = hashCode * 31 + [self.unknownFields hash];
return hashCode;
}
@end
@interface OWSProvisioningProtosProvisionMessageBuilder()
@property (strong) OWSProvisioningProtosProvisionMessage* resultProvisionMessage;
@end
@implementation OWSProvisioningProtosProvisionMessageBuilder
@synthesize resultProvisionMessage;
- (instancetype) init {
if ((self = [super init])) {
self.resultProvisionMessage = [[OWSProvisioningProtosProvisionMessage alloc] init];
}
return self;
}
- (PBGeneratedMessage*) internalGetResult {
return resultProvisionMessage;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) clear {
self.resultProvisionMessage = [[OWSProvisioningProtosProvisionMessage alloc] init];
return self;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) clone {
return [OWSProvisioningProtosProvisionMessage builderWithPrototype:resultProvisionMessage];
}
- (OWSProvisioningProtosProvisionMessage*) defaultInstance {
return [OWSProvisioningProtosProvisionMessage defaultInstance];
}
- (OWSProvisioningProtosProvisionMessage*) build {
[self checkInitialized];
return [self buildPartial];
}
- (OWSProvisioningProtosProvisionMessage*) buildPartial {
OWSProvisioningProtosProvisionMessage* returnMe = resultProvisionMessage;
self.resultProvisionMessage = nil;
return returnMe;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) mergeFrom:(OWSProvisioningProtosProvisionMessage*) other {
if (other == [OWSProvisioningProtosProvisionMessage defaultInstance]) {
return self;
}
if (other.hasIdentityKeyPublic) {
[self setIdentityKeyPublic:other.identityKeyPublic];
}
if (other.hasIdentityKeyPrivate) {
[self setIdentityKeyPrivate:other.identityKeyPrivate];
}
if (other.hasNumber) {
[self setNumber:other.number];
}
if (other.hasProvisioningCode) {
[self setProvisioningCode:other.provisioningCode];
}
[self mergeUnknownFields:other.unknownFields];
return self;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (OWSProvisioningProtosProvisionMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
while (YES) {
SInt32 tag = [input readTag];
switch (tag) {
case 0:
[self setUnknownFields:[unknownFields build]];
return self;
default: {
if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
[self setUnknownFields:[unknownFields build]];
return self;
}
break;
}
case 10: {
[self setIdentityKeyPublic:[input readData]];
break;
}
case 18: {
[self setIdentityKeyPrivate:[input readData]];
break;
}
case 26: {
[self setNumber:[input readString]];
break;
}
case 34: {
[self setProvisioningCode:[input readString]];
break;
}
}
}
}
- (BOOL) hasIdentityKeyPublic {
return resultProvisionMessage.hasIdentityKeyPublic;
}
- (NSData*) identityKeyPublic {
return resultProvisionMessage.identityKeyPublic;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) setIdentityKeyPublic:(NSData*) value {
resultProvisionMessage.hasIdentityKeyPublic = YES;
resultProvisionMessage.identityKeyPublic = value;
return self;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) clearIdentityKeyPublic {
resultProvisionMessage.hasIdentityKeyPublic = NO;
resultProvisionMessage.identityKeyPublic = [NSData data];
return self;
}
- (BOOL) hasIdentityKeyPrivate {
return resultProvisionMessage.hasIdentityKeyPrivate;
}
- (NSData*) identityKeyPrivate {
return resultProvisionMessage.identityKeyPrivate;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) setIdentityKeyPrivate:(NSData*) value {
resultProvisionMessage.hasIdentityKeyPrivate = YES;
resultProvisionMessage.identityKeyPrivate = value;
return self;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) clearIdentityKeyPrivate {
resultProvisionMessage.hasIdentityKeyPrivate = NO;
resultProvisionMessage.identityKeyPrivate = [NSData data];
return self;
}
- (BOOL) hasNumber {
return resultProvisionMessage.hasNumber;
}
- (NSString*) number {
return resultProvisionMessage.number;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) setNumber:(NSString*) value {
resultProvisionMessage.hasNumber = YES;
resultProvisionMessage.number = value;
return self;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) clearNumber {
resultProvisionMessage.hasNumber = NO;
resultProvisionMessage.number = @"";
return self;
}
- (BOOL) hasProvisioningCode {
return resultProvisionMessage.hasProvisioningCode;
}
- (NSString*) provisioningCode {
return resultProvisionMessage.provisioningCode;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) setProvisioningCode:(NSString*) value {
resultProvisionMessage.hasProvisioningCode = YES;
resultProvisionMessage.provisioningCode = value;
return self;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) clearProvisioningCode {
resultProvisionMessage.hasProvisioningCode = NO;
resultProvisionMessage.provisioningCode = @"";
return self;
}
@end
// @@protoc_insertion_point(global_scope)

View File

@ -0,0 +1,16 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
NS_ASSUME_NONNULL_BEGIN
@class TSNetworkManager;
@interface OWSDeviceProvisioningCodeService : NSObject
- (instancetype)initWithNetworkManager:(TSNetworkManager *)networkManager NS_DESIGNATED_INITIALIZER;
- (void)requestProvisioningCodeWithSuccess:(void (^)(NSString *))successCallback
failure:(void (^)(NSError *))failureCallback;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,58 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
#import "OWSDeviceProvisioningCodeService.h"
#import "OWSDeviceProvisioningCodeRequest.h"
#import "TSNetworkManager.h"
NS_ASSUME_NONNULL_BEGIN
NSString *const OWSDeviceProvisioningCodeServiceProvisioningCodeKey = @"verificationCode";
@interface OWSDeviceProvisioningCodeService ()
@property (readonly) TSNetworkManager *networkManager;
@end
@implementation OWSDeviceProvisioningCodeService
- (instancetype)initWithNetworkManager:(TSNetworkManager *)networkManager
{
self = [super init];
if (!self) {
return self;
}
_networkManager = networkManager;
return self;
}
- (instancetype)init
{
return [self initWithNetworkManager:[TSNetworkManager sharedManager]];
}
- (void)requestProvisioningCodeWithSuccess:(void (^)(NSString *))successCallback
failure:(void (^)(NSError *))failureCallback
{
[self.networkManager makeRequest:[OWSDeviceProvisioningCodeRequest new]
success:^(NSURLSessionDataTask *task, id responseObject) {
DDLogVerbose(@"ProvisioningCode request succeeded");
if ([(NSObject *)responseObject isKindOfClass:[NSDictionary class]]) {
NSDictionary *responseDict = (NSDictionary *)responseObject;
NSString *provisioningCode =
[responseDict objectForKey:OWSDeviceProvisioningCodeServiceProvisioningCodeKey];
successCallback(provisioningCode);
}
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
DDLogVerbose(@"ProvisioningCode request failed with error: %@", error);
failureCallback(error);
}];
}
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,18 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
NS_ASSUME_NONNULL_BEGIN
@class TSNetworkManager;
@interface OWSDeviceProvisioningService : NSObject
- (instancetype)initWithNetworkManager:(TSNetworkManager *)networkManager;
- (void)provisionWithMessageBody:(NSData *)messageBody
ephemeralDeviceId:(NSString *)deviceId
success:(void (^)())successCallback
failure:(void (^)(NSError *))failureCallback;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,55 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
#import "OWSDeviceProvisioningService.h"
#import "OWSDeviceProvisioningRequest.h"
#import "TSNetworkManager.h"
NS_ASSUME_NONNULL_BEGIN
@interface OWSDeviceProvisioningService ()
@property (nonatomic, readonly) TSNetworkManager *networkManager;
@end
@implementation OWSDeviceProvisioningService
- (instancetype)initWithNetworkManager:(TSNetworkManager *)networkManager
{
self = [super init];
if (!self) {
return self;
}
_networkManager = networkManager;
return self;
}
- (instancetype)init
{
return [self initWithNetworkManager:[TSNetworkManager sharedManager]];
}
- (void)provisionWithMessageBody:(NSData *)messageBody
ephemeralDeviceId:(NSString *)deviceId
success:(void (^)())successCallback
failure:(void (^)(NSError *))failureCallback
{
OWSDeviceProvisioningRequest *request =
[[OWSDeviceProvisioningRequest alloc] initWithMessageBody:messageBody ephemeralDeviceId:deviceId];
[self.networkManager makeRequest:request
success:^(NSURLSessionDataTask *task, id responseObject) {
DDLogVerbose(@"Provisioning request succeeded");
successCallback();
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
DDLogVerbose(@"Provisioning request failed with error: %@", error);
failureCallback(error);
}];
}
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,11 @@
// Copyright (c) 2016 Open Whisper Systems. All rights reserved.
#import "TSRequest.h"
NS_ASSUME_NONNULL_BEGIN
@interface OWSDeviceProvisioningCodeRequest : TSRequest
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,24 @@
// Copyright (c) 2016 Open Whisper Systems. All rights reserved.
#import "OWSDeviceProvisioningCodeRequest.h"
#import "TSConstants.h"
NS_ASSUME_NONNULL_BEGIN
@implementation OWSDeviceProvisioningCodeRequest
- (instancetype)init
{
self = [super initWithURL:[NSURL URLWithString:textSecureDeviceProvisioningCodeAPI]];
if (!self) {
return self;
}
[self setHTTPMethod:@"GET"];
return self;
}
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,13 @@
// Copyright (c) 2016 Open Whisper Systems. All rights reserved.
#import "TSRequest.h"
NS_ASSUME_NONNULL_BEGIN
@interface OWSDeviceProvisioningRequest : TSRequest
- (instancetype)initWithMessageBody:(NSData *)messageBody ephemeralDeviceId:(NSString *)deviceId;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,27 @@
// Copyright (c) 2016 Open Whisper Systems. All rights reserved.
#import "OWSDeviceProvisioningRequest.h"
#import "TSConstants.h"
#import <SignalServiceKit/NSData+Base64.h>
NS_ASSUME_NONNULL_BEGIN
@implementation OWSDeviceProvisioningRequest
- (instancetype)initWithMessageBody:(NSData *)messageBody ephemeralDeviceId:(NSString *)deviceId
{
NSString *path = [NSString stringWithFormat:textSecureDeviceProvisioningAPIFormat, deviceId];
self = [super initWithURL:[NSURL URLWithString:path]];
if (!self) {
return self;
}
self.HTTPMethod = @"PUT";
[self.parameters addEntriesFromDictionary:@{ @"body" : [messageBody base64EncodedString] }];
return self;
}
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,13 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
#import <25519/Curve25519.h>
NS_ASSUME_NONNULL_BEGIN
@interface ECKeyPair (OWSPrivateKey)
- (NSData *)ows_privateKey;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,16 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
#import "ECKeyPair+OWSPrivateKey.h"
NS_ASSUME_NONNULL_BEGIN
@implementation ECKeyPair (OWSPrivateKey)
- (NSData *)ows_privateKey
{
return [NSData dataWithBytes:self->privateKey length:32];
}
@end
NS_ASSUME_NONNULL_END

View File

@ -1,10 +1,5 @@
//
// TSStorageManager+IdentityKeyStore.m
// TextSecureKit
//
// Created by Frederic Jacobs on 06/11/14.
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
//
#import "TSAccountManager.h"
#import "TSStorageManager+IdentityKeyStore.h"

View File

@ -36,7 +36,8 @@ typedef enum { kSMSVerification, kPhoneNumberVerification } VerificationTranspor
#define textSecureSignedKeysAPI @"v2/keys/signed"
#define textSecureDirectoryAPI @"v1/directory"
#define textSecureAttachmentsAPI @"v1/attachments"
#define textSecureDeviceProvisioningCodeAPI @"v1/devices/provisioning/code"
#define textSecureDeviceProvisioningAPIFormat @"v1/provisioning/%@"
typedef void (^successCompletionBlock)(void);
typedef void (^failedRegistrationRequestBlock)(void);

View File

@ -0,0 +1,108 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
#import "OWSDeviceProvisioner.h"
#import "OWSDeviceProvisioningCodeService.h"
#import "OWSDeviceProvisioningService.h"
#import "TSNetworkManager.h"
#import <XCTest/XCTest.h>
@interface OWSFakeDeviceProvisioningService : OWSDeviceProvisioningService
@end
@implementation OWSFakeDeviceProvisioningService
- (void)provisionWithMessageBody:(NSData *)messageBody
ephemeralDeviceId:(NSString *)deviceId
success:(void (^)())successCallback
failure:(void (^)(NSError *))failureCallback
{
NSLog(@"faking successful provisioning");
successCallback();
}
@end
@interface OWSFakeDeviceProvisioningCodeService : OWSDeviceProvisioningCodeService
@end
@implementation OWSFakeDeviceProvisioningCodeService
- (void)requestProvisioningCodeWithSuccess:(void (^)(NSString *))successCallback
failure:(void (^)(NSError *))failureCallback
{
NSLog(@"faking successful provisioning code fetching");
successCallback(@"fake-provisioning-code");
}
@end
@interface OWSDeviceProvisioner (Testing)
@property OWSDeviceProvisioningCodeService *provisioningCodeService;
@property OWSDeviceProvisioningService *provisioningService;
@end
@interface OWSFakeNetworkManager : TSNetworkManager
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initFake;
@end
@implementation OWSFakeNetworkManager
- (instancetype)initFake
{
return self;
}
@end
@interface OWSDeviceProvisionerTest : XCTestCase
@end
@implementation OWSDeviceProvisionerTest
- (void)testProvisioning
{
XCTestExpectation *expectation = [self expectationWithDescription:@"Provisioning Success"];
NSData *nullKey = [[NSMutableData dataWithLength:32] copy];
NSData *myPublicKey = [nullKey copy];
NSData *myPrivateKey = [nullKey copy];
NSData *theirPublicKey = [nullKey copy];
NSString *accountIdentifier;
NSString *theirEphemeralDeviceId;
OWSFakeNetworkManager *networkManager = [[OWSFakeNetworkManager alloc] initFake];
OWSDeviceProvisioner *provisioner = [[OWSDeviceProvisioner alloc]
initWithMyPublicKey:myPublicKey
myPrivateKey:myPrivateKey
theirPublicKey:theirPublicKey
theirEphemeralDeviceId:theirEphemeralDeviceId
accountIdentifier:accountIdentifier
provisioningCodeService:[[OWSFakeDeviceProvisioningCodeService alloc] initWithNetworkManager:networkManager]
provisioningService:[[OWSFakeDeviceProvisioningService alloc] initWithNetworkManager:networkManager]];
[provisioner provisionWithSuccess:^{
[expectation fulfill];
}
failure:^(NSError *_Nonnull error) {
XCTAssert(NO, @"Failed to provision with error: %@", error);
}];
[self waitForExpectationsWithTimeout:5.0
handler:^(NSError *error) {
if (error) {
NSLog(@"Timeout Error: %@", error);
}
}];
}
@end