15size_t detws_wave_encode_psid(uint32_t psid, uint8_t *out,
size_t cap)
22 out[0] = (uint8_t)psid;
29 out[0] = (uint8_t)(0x80 | (psid >> 8));
30 out[1] = (uint8_t)psid;
37 out[0] = (uint8_t)(0xC0 | (psid >> 16));
38 out[1] = (uint8_t)(psid >> 8);
39 out[2] = (uint8_t)psid;
44 out[0] = (uint8_t)(0xE0 | (psid >> 24));
45 out[1] = (uint8_t)(psid >> 16);
46 out[2] = (uint8_t)(psid >> 8);
47 out[3] = (uint8_t)psid;
51size_t detws_wave_decode_psid(
const uint8_t *in,
size_t len, uint32_t *psid)
53 if (!in || len < 1 || !psid)
61 if ((b0 & 0xC0) == 0x80)
65 *psid = (uint32_t)((b0 & 0x3F) << 8) | in[1];
68 if ((b0 & 0xE0) == 0xC0)
72 *psid = (uint32_t)((b0 & 0x1F) << 16) | ((uint32_t)in[1] << 8) | in[2];
75 if ((b0 & 0xF0) == 0xE0)
79 *psid = (uint32_t)((b0 & 0x0F) << 24) | ((uint32_t)in[1] << 16) | ((uint32_t)in[2] << 8) | in[3];
85size_t detws_wsmp_build(uint32_t psid,
const uint8_t *payload,
size_t payload_len, uint8_t *out,
size_t cap)
87 if (!out || (payload_len && !payload) || payload_len > 255)
92 out[i++] = Wave::WSMP_VERSION;
93 size_t p = detws_wave_encode_psid(psid, out + i, cap - i);
97 if (i + 1 + payload_len > cap)
99 out[i++] = (uint8_t)payload_len;
102 memcpy(out + i, payload, payload_len);
108bool detws_wsmp_parse(
const uint8_t *frame,
size_t len, WsmpFrame *out)
110 if (!frame || !out || len < 3)
112 if ((frame[0] & 0x0F) != Wave::WSMP_VERSION)
115 size_t p = detws_wave_decode_psid(frame + 1, len - 1, &psid);
121 uint8_t wlen = frame[off++];
122 if (off + wlen > len)
125 out->payload = wlen ? (frame + off) : nullptr;
126 out->payload_len = wlen;
130size_t detws_wave_1609dot2_wrap(uint8_t content_type,
const uint8_t *payload,
size_t payload_len, uint8_t *out,
133 if (!out || (payload_len && !payload))
135 size_t n = 2 + payload_len;
138 out[0] = Wave::WAVE_16092_VERSION;
139 out[1] = content_type;
141 memcpy(out + 2, payload, payload_len);
IEEE 1609 WAVE (WSMP + 1609.2 security envelope) codec (DETWS_ENABLE_WAVE).