54 lines
2.1 KiB
Swift
54 lines
2.1 KiB
Swift
//
|
|
// Copyright 2023 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
|
|
/// Represents a message sent to linked devices during a PNI distribution event
|
|
/// informing those devices of the new PNI identity.
|
|
///
|
|
/// Note that this type is not a ``TSOutgoingMessage`` subclass, as it is not
|
|
/// sent through our message-sending machinery, and is instead part of a
|
|
/// PNI distribution request (and thereafter distributed by the service).
|
|
final class PniDistributionSyncMessage {
|
|
private let pniIdentityKeyPair: ECKeyPair
|
|
private let signedPreKey: SignedPreKeyRecord
|
|
private let pqLastResortPreKey: KyberPreKeyRecord
|
|
private let registrationId: UInt32
|
|
private let e164: E164
|
|
|
|
init(
|
|
pniIdentityKeyPair: ECKeyPair,
|
|
signedPreKey: SignedPreKeyRecord,
|
|
pqLastResortPreKey: KyberPreKeyRecord,
|
|
registrationId: UInt32,
|
|
e164: E164
|
|
) {
|
|
self.pniIdentityKeyPair = pniIdentityKeyPair
|
|
self.signedPreKey = signedPreKey
|
|
self.pqLastResortPreKey = pqLastResortPreKey
|
|
self.registrationId = registrationId
|
|
self.e164 = e164
|
|
}
|
|
|
|
/// Build a serialized message proto for this sync message.
|
|
func buildSerializedMessageProto() throws -> Data {
|
|
let changeNumberBuilder = SSKProtoSyncMessagePniChangeNumber.builder()
|
|
changeNumberBuilder.setIdentityKeyPair(Data(pniIdentityKeyPair.identityKeyPair.serialize()))
|
|
changeNumberBuilder.setSignedPreKey(Data(try signedPreKey.asLSCRecord().serialize()))
|
|
changeNumberBuilder.setLastResortKyberPreKey(Data(try pqLastResortPreKey.asLSCRecord().serialize()))
|
|
changeNumberBuilder.setRegistrationID(registrationId)
|
|
changeNumberBuilder.setNewE164(e164.stringValue)
|
|
|
|
let syncMessageBuilder = SSKProtoSyncMessage.builder()
|
|
syncMessageBuilder.setPniChangeNumber(changeNumberBuilder.buildInfallibly())
|
|
|
|
let syncMessageProto = try OWSOutgoingSyncMessage.buildSyncMessageProto(for: syncMessageBuilder)
|
|
|
|
let contentProto = SSKProtoContent.builder()
|
|
contentProto.setSyncMessage(syncMessageProto)
|
|
|
|
return try contentProto.buildSerializedData()
|
|
}
|
|
}
|