62 lines
1.6 KiB
Swift
62 lines
1.6 KiB
Swift
//
|
|
// Copyright 2022 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import LibSignalClient
|
|
import SignalServiceKit
|
|
|
|
class DeviceProvisioningURL {
|
|
|
|
let ephemeralDeviceId: String
|
|
|
|
let publicKey: PublicKey
|
|
|
|
enum Constants {
|
|
static let linkDeviceHost = "linkdevice"
|
|
}
|
|
|
|
init?(urlString: String) {
|
|
guard let queryItems = URLComponents(string: urlString)?.queryItems else {
|
|
return nil
|
|
}
|
|
|
|
var ephemeralDeviceId: String?
|
|
var publicKey: PublicKey?
|
|
for queryItem in queryItems {
|
|
switch queryItem.name {
|
|
case "uuid":
|
|
ephemeralDeviceId = queryItem.value
|
|
case "pub_key":
|
|
publicKey = Self.decodePublicKey(queryItem.value)
|
|
default:
|
|
Logger.warn("unknown query item in provisioning string: \(queryItem.name)")
|
|
}
|
|
}
|
|
|
|
guard let ephemeralDeviceId, let publicKey else {
|
|
return nil
|
|
}
|
|
|
|
self.ephemeralDeviceId = ephemeralDeviceId
|
|
self.publicKey = publicKey
|
|
}
|
|
|
|
private static func decodePublicKey(_ encodedPublicKey: String?) -> PublicKey? {
|
|
guard let encodedPublicKey else {
|
|
return nil
|
|
}
|
|
guard let annotatedPublicKey = Data(base64Encoded: encodedPublicKey, options: [.ignoreUnknownCharacters]) else {
|
|
return nil
|
|
}
|
|
let publicKey: PublicKey
|
|
do {
|
|
publicKey = try PublicKey(annotatedPublicKey)
|
|
} catch {
|
|
owsFailDebug("failed to parse key: \(error)")
|
|
return nil
|
|
}
|
|
return publicKey
|
|
}
|
|
}
|