This commit is contained in:
Max Goedjen 2025-08-31 19:12:33 -07:00
parent 11f1f83113
commit e5cece6933
No known key found for this signature in database
3 changed files with 21 additions and 14 deletions

View File

@ -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<UInt32>.size)
return countData + keyData
}

View File

@ -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<UInt32>.size) + self
}
}

View File

@ -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..<length
let ret = Data(remaining[dataRange])
remaining.removeSubrange(dataRange)
@ -27,7 +24,9 @@ public final class OpenSSHReader {
}
public func readNextBytes<T>(as: T.Type) throws -> T {
let lengthRange = 0..<MemoryLayout<T>.size
let size = MemoryLayout<T>.size
guard remaining.count >= size else { throw EndOfData() }
let lengthRange = 0..<size
let lengthChunk = remaining[lengthRange]
remaining.removeSubrange(lengthRange)
return lengthChunk.bytes.unsafeLoad(as: T.self)