// // Copyright 2024 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only // import Foundation public import LibSignalClient public struct MessageBackupServiceAuth { private let authHeaders: [String: String] public let publicKey: PublicKey // Remember the type of auth this credential represents (message vs media). // This makes it easier to cache requested information correctly based on the type public let type: MessageBackupAuthCredentialType public init(backupKey: Data, privateKey: PrivateKey, authCredential: BackupAuthCredential, type: MessageBackupAuthCredentialType) throws { let backupServerPublicParams = try GenericServerPublicParams(contents: [UInt8](TSConstants.backupServerPublicParams)) let presentation = authCredential.present(serverParams: backupServerPublicParams).serialize() let signedPresentation = privateKey.generateSignature(message: presentation) self.type = type self.publicKey = privateKey.publicKey self.authHeaders = [ "X-Signal-ZK-Auth": Data(presentation).base64EncodedString(), "X-Signal-ZK-Auth-Signature": Data(signedPresentation).base64EncodedString() ] } public func apply(to httpHeaders: inout HttpHeaders) { for (headerKey, headerValue) in authHeaders { httpHeaders.addHeader(headerKey, value: headerValue, overwriteOnConflict: true) } } }