15const char NTS_EXPORTER_LABEL[] =
"EXPORTER-network-time-security";
17static void put_u16(uint8_t *p, uint16_t v)
19 p[0] = (uint8_t)(v >> 8);
22static uint16_t get_u16(
const uint8_t *p)
24 return (uint16_t)((p[0] << 8) | p[1]);
27size_t pc_nts_ke_record(
bool critical, uint16_t type,
const uint8_t *body,
size_t body_len, uint8_t *out,
size_t cap)
29 if (!out || (body_len && !body) || body_len > 0xFFFF)
33 size_t n = 4 + body_len;
38 put_u16(out, (uint16_t)((type & 0x7FFF) | (critical ? Nts::NTS_KE_CRITICAL : 0)));
39 put_u16(out + 2, (uint16_t)body_len);
42 memcpy(out + 4, body, body_len);
47size_t pc_nts_ke_request(uint8_t *out,
size_t cap)
50 put_u16(proto, Nts::NTS_NEXT_PROTO_NTPV4);
52 put_u16(aead, Nts::NTS_AEAD_AES_SIV_CMAC_256);
56 r = pc_nts_ke_record(
true, Nts::NTS_KE_NEXT_PROTOCOL, proto, 2, out + n, cap - n);
62 r = pc_nts_ke_record(
true, Nts::NTS_KE_AEAD_ALGORITHM, aead, 2, out + n, cap - n);
68 r = pc_nts_ke_record(
true, Nts::NTS_KE_END_OF_MESSAGE,
nullptr, 0, out + n, cap - n);
77bool pc_nts_ke_parse(
const uint8_t *buf,
size_t len, pc_nts_ke_cb cb,
void *arg)
81 while (off + 4 <= len)
83 uint16_t tf = get_u16(buf + off);
84 uint16_t blen = get_u16(buf + off + 2);
85 bool critical = (tf & Nts::NTS_KE_CRITICAL) != 0;
86 uint16_t type = (uint16_t)(tf & 0x7FFF);
87 if (off + 4 + blen > len)
93 cb(critical, type, blen ? (buf + off + 4) : nullptr, blen, arg);
96 if (type == Nts::NTS_KE_END_OF_MESSAGE)
105size_t pc_nts_ef(uint16_t field_type,
const uint8_t *value,
size_t value_len, uint8_t *out,
size_t cap)
107 if (!out || (value_len && !value))
112 size_t total = 4 + value_len;
113 size_t padded = (total + 3) & ~(
size_t)3;
114 if (padded > 0xFFFF || padded > cap)
118 put_u16(out, field_type);
119 put_u16(out + 2, (uint16_t)padded);
122 memcpy(out + 4, value, value_len);
124 for (
size_t i = total; i < padded; i++)
131size_t pc_nts_ef_unique_id(
const uint8_t *nonce,
size_t nonce_len, uint8_t *out,
size_t cap)
133 return pc_nts_ef(NtsEf::NTS_EF_UNIQUE_IDENTIFIER, nonce, nonce_len, out, cap);
136size_t pc_nts_ef_cookie(
const uint8_t *cookie,
size_t cookie_len, uint8_t *out,
size_t cap)
138 return pc_nts_ef(NtsEf::NTS_EF_COOKIE, cookie, cookie_len, out, cap);
Network Time Security (NTS, RFC 8915) wire codec (PC_ENABLE_NTS).