TM-SGNL-iOS/SignalServiceKit/Account/PniDistributionSyncMessage.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

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()
}
}