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:
|
case .protocolExtension:
|
||||||
response.append(SSHAgent.ResponseType.agentExtensionResponse.data)
|
response.append(SSHAgent.ResponseType.agentExtensionResponse.data)
|
||||||
try await handleExtension(data)
|
try await handleExtension(data)
|
||||||
default:
|
case .addIDConstrained, .addIdentity:
|
||||||
let reader = OpenSSHReader(data: data)
|
let reader = OpenSSHReader(data: data)
|
||||||
|
let keyname = try reader.readNextChunkAsString()
|
||||||
|
print(keyname)
|
||||||
while true {
|
while true {
|
||||||
do {
|
do {
|
||||||
let payloadHash = try reader.readNextChunk()
|
let payloadHash = try reader.readNextChunk(convertEndianness: true)
|
||||||
print(String(String(decoding: payloadHash, as: UTF8.self)))
|
print(String(decoding: payloadHash, as: UTF8.self))
|
||||||
print(payloadHash)
|
print(payloadHash)
|
||||||
} catch {
|
} catch {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case .addSmartcardKeyConstrained, .addSmartcardKey:
|
||||||
|
break
|
||||||
|
default:
|
||||||
logger.debug("Agent received valid request of type \(requestType.debugDescription), but not currently supported.")
|
logger.debug("Agent received valid request of type \(requestType.debugDescription), but not currently supported.")
|
||||||
response.append(SSHAgent.ResponseType.agentFailure.data)
|
response.append(SSHAgent.ResponseType.agentFailure.data)
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
response = SSHAgent.ResponseType.agentFailure.data
|
response = SSHAgent.ResponseType.agentFailure.data
|
||||||
@ -97,7 +103,9 @@ extension Agent {
|
|||||||
|
|
||||||
func handleExtension(_ data: Data) async throws {
|
func handleExtension(_ data: Data) async throws {
|
||||||
let reader = OpenSSHReader(data: data)
|
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 hostKey = try reader.readNextChunk()
|
||||||
let keyReader = OpenSSHReader(data: hostKey)
|
let keyReader = OpenSSHReader(data: hostKey)
|
||||||
_ = try keyReader.readNextChunkAsString() // Key Type
|
_ = try keyReader.readNextChunkAsString() // Key Type
|
||||||
@ -138,7 +146,7 @@ extension Agent {
|
|||||||
}
|
}
|
||||||
logger.log("Agent enumerated \(count) identities")
|
logger.log("Agent enumerated \(count) identities")
|
||||||
var countBigEndian = UInt32(count).bigEndian
|
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
|
return countData + keyData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ extension Data {
|
|||||||
package var lengthAndData: Data {
|
package var lengthAndData: Data {
|
||||||
let rawLength = UInt32(count)
|
let rawLength = UInt32(count)
|
||||||
var endian = rawLength.bigEndian
|
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.
|
/// Reads the next chunk of data from the playload.
|
||||||
/// - Returns: The next chunk of data.
|
/// - Returns: The next chunk of data.
|
||||||
public func readNextChunk() throws -> Data {
|
public func readNextChunk(convertEndianness: Bool = true) throws -> Data {
|
||||||
guard remaining.count > UInt32.bitWidth/8 else { throw EndOfData() }
|
let littleEndianLength = try readNextBytes(as: UInt32.self)
|
||||||
let lengthRange = 0..<(UInt32.bitWidth/8)
|
let length = convertEndianness ? Int(littleEndianLength.bigEndian) : Int(littleEndianLength)
|
||||||
let lengthChunk = remaining[lengthRange]
|
guard remaining.count >= length else { throw EndOfData() }
|
||||||
remaining.removeSubrange(lengthRange)
|
|
||||||
let littleEndianLength = lengthChunk.bytes.unsafeLoad(as: UInt32.self)
|
|
||||||
let length = Int(littleEndianLength.bigEndian)
|
|
||||||
let dataRange = 0..<length
|
let dataRange = 0..<length
|
||||||
let ret = Data(remaining[dataRange])
|
let ret = Data(remaining[dataRange])
|
||||||
remaining.removeSubrange(dataRange)
|
remaining.removeSubrange(dataRange)
|
||||||
@ -27,7 +24,9 @@ public final class OpenSSHReader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func readNextBytes<T>(as: T.Type) throws -> T {
|
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]
|
let lengthChunk = remaining[lengthRange]
|
||||||
remaining.removeSubrange(lengthRange)
|
remaining.removeSubrange(lengthRange)
|
||||||
return lengthChunk.bytes.unsafeLoad(as: T.self)
|
return lengthChunk.bytes.unsafeLoad(as: T.self)
|
||||||
|
Loading…
Reference in New Issue
Block a user