feat(protocol): bind tunnel admission to device proof
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
// Code generated by tools/generate.py; DO NOT EDIT.
|
||||
import Foundation
|
||||
public typealias JSONObject = [String: String]
|
||||
public let schemaSHA256 = "b8a69785112bb94d45f47c2250ca59d0bde47e3667b8ad89c9b0e2c4cfb25aec"
|
||||
public let schemaSHA256 = "6b8631bf2b2aa12b14d0bc4d136af39a632e85b3237dc5614469ba09d93f5fca"
|
||||
public let currentWireVersion = "1"
|
||||
public let nMinus1WireVersion = "0"
|
||||
public let nMinus2WireVersion = "-1"
|
||||
@@ -1797,6 +1797,7 @@ public struct TunnelAdmissionRequest: Codable, Equatable {
|
||||
public let grant: String
|
||||
public let reconnectSequence: Int64
|
||||
public let clientNonce: String
|
||||
public let deviceSignature: String
|
||||
public let capabilities: CapabilityProfile
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case version = "version"
|
||||
@@ -1806,10 +1807,11 @@ public struct TunnelAdmissionRequest: Codable, Equatable {
|
||||
case grant = "grant"
|
||||
case reconnectSequence = "reconnect_sequence"
|
||||
case clientNonce = "client_nonce"
|
||||
case deviceSignature = "device_signature"
|
||||
case capabilities = "capabilities"
|
||||
}
|
||||
|
||||
public init(version: String, sessionId: String, gatewayId: String, audience: String, grant: String, reconnectSequence: Int64, clientNonce: String, capabilities: CapabilityProfile) throws {
|
||||
public init(version: String, sessionId: String, gatewayId: String, audience: String, grant: String, reconnectSequence: Int64, clientNonce: String, deviceSignature: String, capabilities: CapabilityProfile) throws {
|
||||
self.version = version
|
||||
self.sessionId = sessionId
|
||||
self.gatewayId = gatewayId
|
||||
@@ -1817,6 +1819,7 @@ public struct TunnelAdmissionRequest: Codable, Equatable {
|
||||
self.grant = grant
|
||||
self.reconnectSequence = reconnectSequence
|
||||
self.clientNonce = clientNonce
|
||||
self.deviceSignature = deviceSignature
|
||||
self.capabilities = capabilities
|
||||
try validate()
|
||||
}
|
||||
@@ -1825,7 +1828,7 @@ public struct TunnelAdmissionRequest: Codable, Equatable {
|
||||
let all = try decoder.container(keyedBy: AnyCodingKey.self)
|
||||
for key in all.allKeys where CodingKeys(stringValue: key.stringValue) == nil { throw ContractValidationError(field: key.stringValue, code: "unknown_field") }
|
||||
let c = try decoder.container(keyedBy: CodingKeys.self)
|
||||
try self.init(version: try c.decode(String.self, forKey: .version), sessionId: try c.decode(String.self, forKey: .sessionId), gatewayId: try c.decode(String.self, forKey: .gatewayId), audience: try c.decode(String.self, forKey: .audience), grant: try c.decode(String.self, forKey: .grant), reconnectSequence: try c.decode(Int64.self, forKey: .reconnectSequence), clientNonce: try c.decode(String.self, forKey: .clientNonce), capabilities: try c.decode(CapabilityProfile.self, forKey: .capabilities))
|
||||
try self.init(version: try c.decode(String.self, forKey: .version), sessionId: try c.decode(String.self, forKey: .sessionId), gatewayId: try c.decode(String.self, forKey: .gatewayId), audience: try c.decode(String.self, forKey: .audience), grant: try c.decode(String.self, forKey: .grant), reconnectSequence: try c.decode(Int64.self, forKey: .reconnectSequence), clientNonce: try c.decode(String.self, forKey: .clientNonce), deviceSignature: try c.decode(String.self, forKey: .deviceSignature), capabilities: try c.decode(CapabilityProfile.self, forKey: .capabilities))
|
||||
}
|
||||
|
||||
public func validate() throws {
|
||||
@@ -1846,6 +1849,9 @@ public struct TunnelAdmissionRequest: Codable, Equatable {
|
||||
if self.clientNonce.isEmpty { throw ContractValidationError(field: "client_nonce", code: "required") }
|
||||
if !self.clientNonce.isEmpty && self.clientNonce.utf8.count < 16 { throw ContractValidationError(field: "client_nonce", code: "min_length") }
|
||||
if self.clientNonce.utf8.count > 128 { throw ContractValidationError(field: "client_nonce", code: "max_length") }
|
||||
if self.deviceSignature.isEmpty { throw ContractValidationError(field: "device_signature", code: "required") }
|
||||
if !self.deviceSignature.isEmpty && self.deviceSignature.utf8.count < 86 { throw ContractValidationError(field: "device_signature", code: "min_length") }
|
||||
if self.deviceSignature.utf8.count > 86 { throw ContractValidationError(field: "device_signature", code: "max_length") }
|
||||
try self.capabilities.validate()
|
||||
}
|
||||
|
||||
@@ -1884,6 +1890,15 @@ public struct VersionNegotiation: Codable, Equatable {
|
||||
public func encodeJSON() throws -> Data { try validate(); return try JSONEncoder().encode(self) }
|
||||
}
|
||||
|
||||
public extension TunnelAdmissionRequest {
|
||||
func deviceAdmissionTranscript() -> Data {
|
||||
let fields = [sessionId, gatewayId, audience, grant, String(reconnectSequence), clientNonce, capabilities.transport, capabilities.framing, capabilities.media, capabilities.audio, capabilities.sourceRateControl, capabilities.clientDecode]
|
||||
var transcript = "versevdi/tunnel-admission/v1"
|
||||
for field in fields { transcript += "\(field.utf8.count):\(field)" }
|
||||
return Data(transcript.utf8)
|
||||
}
|
||||
}
|
||||
|
||||
public extension CapabilityProfile {
|
||||
static func intersection(_ profiles: [CapabilityProfile]) throws -> CapabilityProfile {
|
||||
guard let selected = profiles.first else { throw ContractValidationError(field: "capabilities", code: "no_overlap") }
|
||||
|
||||
Reference in New Issue
Block a user