diff --git a/Signal/test/views/ImageEditorTest.swift b/Signal/test/views/ImageEditorTest.swift index 5a4642a8d..343e168a6 100644 --- a/Signal/test/views/ImageEditorTest.swift +++ b/Signal/test/views/ImageEditorTest.swift @@ -26,7 +26,10 @@ class ImageEditorTest: SignalBaseTest { } func testImageEditorContents() { - let contents = ImageEditorContents() + let imagePath = writeDummyImage() + + let contents = ImageEditorContents(imagePath: imagePath, + imageSizePixels: CGSize(width: 1, height: 1)) XCTAssertEqual(0, contents.itemMap.count) let item = ImageEditorItem(itemType: .test) diff --git a/SignalServiceKit/src/Devices/OWSDevice.m b/SignalServiceKit/src/Devices/OWSDevice.m index b81dca1db..54f6ad2cd 100644 --- a/SignalServiceKit/src/Devices/OWSDevice.m +++ b/SignalServiceKit/src/Devices/OWSDevice.m @@ -288,7 +288,7 @@ NSString *const kOWSPrimaryStorage_MayHaveLinkedDevices = @"kTSStorageManager_Ma if (identityKeyPair) { NSError *error; NSString *_Nullable decryptedName = - [DeviceNames decryptDeviceNameWithInputString:self.name identityKeyPair:identityKeyPair error:&error]; + [DeviceNames decryptDeviceNameWithBase64String:self.name identityKeyPair:identityKeyPair error:&error]; if (error) { // Not necessarily an error; might be a legacy device name. OWSLogError(@"Could not decrypt device name: %@", error); diff --git a/SignalServiceKit/src/Util/DeviceNames.swift b/SignalServiceKit/src/Util/DeviceNames.swift index b220b2e58..e82818401 100644 --- a/SignalServiceKit/src/Util/DeviceNames.swift +++ b/SignalServiceKit/src/Util/DeviceNames.swift @@ -4,6 +4,7 @@ import Foundation import Curve25519Kit +import AxolotlKit @objc public enum DeviceNameError: Int, Error { @@ -59,7 +60,11 @@ public class DeviceNames: NSObject { throw DeviceNameError.assertionFailure } - let protoBuilder = SignalIOSProtoDeviceName.builder(ephemeralPublic: ephemeralKeyPair.publicKey, + guard let keyData = (ephemeralKeyPair.publicKey as NSData).prependKeyType() else { + owsFailDebug("Could not prepend key type.") + throw DeviceNameError.assertionFailure + } + let protoBuilder = SignalIOSProtoDeviceName.builder(ephemeralPublic: keyData as Data, syntheticIv: syntheticIV, ciphertext: ciphertext.ciphertext) let protoData = try protoBuilder.buildSerializedData() @@ -107,26 +112,35 @@ public class DeviceNames: NSObject { } @objc - public class func decryptDeviceName(inputString: String, + public class func decryptDeviceName(base64String: String, identityKeyPair: ECKeyPair) throws -> String { - guard let inputData = Data(base64Encoded: inputString) else { + + guard let protoData = Data(base64Encoded: base64String) else { // Not necessarily an error; might be a legacy device name. throw DeviceNameError.invalidInput } - return try decryptDeviceName(inputData: inputData, + return try decryptDeviceName(protoData: protoData, identityKeyPair: identityKeyPair) } @objc - public class func decryptDeviceName(inputData: Data, + public class func decryptDeviceName(base64Data: Data, identityKeyPair: ECKeyPair) throws -> String { - guard let protoData = Data(base64Encoded: inputData) else { + guard let protoData = Data(base64Encoded: base64Data) else { // Not necessarily an error; might be a legacy device name. throw DeviceNameError.invalidInput } + return try decryptDeviceName(protoData: protoData, + identityKeyPair: identityKeyPair) + } + + @objc + public class func decryptDeviceName(protoData: Data, + identityKeyPair: ECKeyPair) throws -> String { + let proto: SignalIOSProtoDeviceName do { proto = try SignalIOSProtoDeviceName.parseData(protoData) @@ -136,10 +150,18 @@ public class DeviceNames: NSObject { throw DeviceNameError.invalidInput } - let ephemeralPublic = proto.ephemeralPublic + let ephemeralPublicData = proto.ephemeralPublic let receivedSyntheticIV = proto.syntheticIv let ciphertext = proto.ciphertext + let ephemeralPublic: Data + do { + ephemeralPublic = try (ephemeralPublicData as NSData).removeKeyType() as Data + } catch { + owsFailDebug("failed to remove key type") + throw DeviceNameError.invalidInput + } + guard ephemeralPublic.count > 0 else { owsFailDebug("Invalid ephemeral public.") throw DeviceNameError.assertionFailure diff --git a/SignalServiceKit/tests/Util/DeviceNamesTest.swift b/SignalServiceKit/tests/Util/DeviceNamesTest.swift index 52a6c394a..a8ca372de 100644 --- a/SignalServiceKit/tests/Util/DeviceNamesTest.swift +++ b/SignalServiceKit/tests/Util/DeviceNamesTest.swift @@ -31,7 +31,7 @@ class DeviceNamesTest: SSKBaseTestSwift { } do { - _ = try DeviceNames.decryptDeviceName(inputData: plaintextData, + _ = try DeviceNames.decryptDeviceName(base64Data: plaintextData, identityKeyPair: identityKeyPair) XCTFail("Unexpectedly did not throw error.") } catch DeviceNameError.invalidInput { @@ -53,7 +53,7 @@ class DeviceNamesTest: SSKBaseTestSwift { let base64Data = plaintextData.base64EncodedData() do { - _ = try DeviceNames.decryptDeviceName(inputData: base64Data, + _ = try DeviceNames.decryptDeviceName(base64Data: base64Data, identityKeyPair: identityKeyPair) XCTFail("Unexpectedly did not throw error.") } catch DeviceNameError.invalidInput { @@ -79,7 +79,7 @@ class DeviceNamesTest: SSKBaseTestSwift { let decrypted: String do { - decrypted = try DeviceNames.decryptDeviceName(inputData: encrypted, + decrypted = try DeviceNames.decryptDeviceName(base64Data: encrypted, identityKeyPair: identityKeyPair) } catch { XCTFail("Failed with error: \(error)")