mirror of
https://github.com/maxgoedjen/secretive.git
synced 2025-09-20 03:10:57 +00:00
WIP
This commit is contained in:
parent
11f1f83113
commit
e5cece6933
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user