diff --git a/Sources/Packages/Sources/SecretAgentKit/Agent.swift b/Sources/Packages/Sources/SecretAgentKit/Agent.swift index a8f3065..7e9b92e 100644 --- a/Sources/Packages/Sources/SecretAgentKit/Agent.swift +++ b/Sources/Packages/Sources/SecretAgentKit/Agent.swift @@ -69,19 +69,25 @@ extension Agent { case .protocolExtension: response.append(SSHAgent.ResponseType.agentExtensionResponse.data) try await handleExtension(data) - default: + case .addIDConstrained, .addIdentity: let reader = OpenSSHReader(data: data) + let keyname = try reader.readNextChunkAsString() + print(keyname) while true { do { - let payloadHash = try reader.readNextChunk() - print(String(String(decoding: payloadHash, as: UTF8.self))) + let payloadHash = try reader.readNextChunk(convertEndianness: true) + print(String(decoding: payloadHash, as: UTF8.self)) print(payloadHash) } catch { break } } + case .addSmartcardKeyConstrained, .addSmartcardKey: + break + default: logger.debug("Agent received valid request of type \(requestType.debugDescription), but not currently supported.") response.append(SSHAgent.ResponseType.agentFailure.data) + } } catch { response = SSHAgent.ResponseType.agentFailure.data @@ -97,7 +103,9 @@ extension Agent { func handleExtension(_ data: Data) async throws { let reader = OpenSSHReader(data: data) - guard try reader.readNextChunkAsString() == "session-bind@openssh.com" else { throw UnsupportedExtensionError() } + guard try reader.readNextChunkAsString() == "session-bind@openssh.com" else { + throw UnsupportedExtensionError() + } let hostKey = try reader.readNextChunk() let keyReader = OpenSSHReader(data: hostKey) _ = try keyReader.readNextChunkAsString() // Key Type @@ -138,7 +146,7 @@ extension Agent { } logger.log("Agent enumerated \(count) identities") var countBigEndian = UInt32(count).bigEndian - let countData = Data(bytes: &countBigEndian, count: UInt32.bitWidth/8) + let countData = Data(bytes: &countBigEndian, count: MemoryLayout.size) return countData + keyData } diff --git a/Sources/Packages/Sources/SecretKit/OpenSSH/LengthAndData.swift b/Sources/Packages/Sources/SecretKit/OpenSSH/LengthAndData.swift index 33acc06..dd276a7 100644 --- a/Sources/Packages/Sources/SecretKit/OpenSSH/LengthAndData.swift +++ b/Sources/Packages/Sources/SecretKit/OpenSSH/LengthAndData.swift @@ -7,7 +7,7 @@ extension Data { package var lengthAndData: Data { let rawLength = UInt32(count) var endian = rawLength.bigEndian - return Data(bytes: &endian, count: UInt32.bitWidth/8) + self + return Data(bytes: &endian, count: MemoryLayout.size) + self } } diff --git a/Sources/Packages/Sources/SecretKit/OpenSSH/OpenSSHReader.swift b/Sources/Packages/Sources/SecretKit/OpenSSH/OpenSSHReader.swift index bee41c1..22417cb 100644 --- a/Sources/Packages/Sources/SecretKit/OpenSSH/OpenSSHReader.swift +++ b/Sources/Packages/Sources/SecretKit/OpenSSH/OpenSSHReader.swift @@ -13,13 +13,10 @@ public final class OpenSSHReader { /// Reads the next chunk of data from the playload. /// - Returns: The next chunk of data. - public func readNextChunk() throws -> Data { - guard remaining.count > UInt32.bitWidth/8 else { throw EndOfData() } - let lengthRange = 0..<(UInt32.bitWidth/8) - let lengthChunk = remaining[lengthRange] - remaining.removeSubrange(lengthRange) - let littleEndianLength = lengthChunk.bytes.unsafeLoad(as: UInt32.self) - let length = Int(littleEndianLength.bigEndian) + public func readNextChunk(convertEndianness: Bool = true) throws -> Data { + let littleEndianLength = try readNextBytes(as: UInt32.self) + let length = convertEndianness ? Int(littleEndianLength.bigEndian) : Int(littleEndianLength) + guard remaining.count >= length else { throw EndOfData() } let dataRange = 0..(as: T.Type) throws -> T { - let lengthRange = 0...size + let size = MemoryLayout.size + guard remaining.count >= size else { throw EndOfData() } + let lengthRange = 0..