15size_t pc_wave_encode_psid(uint32_t psid, uint8_t *out,
size_t cap)
24 out[0] = (uint8_t)psid;
33 out[0] = (uint8_t)(0x80 | (psid >> 8));
34 out[1] = (uint8_t)psid;
43 out[0] = (uint8_t)(0xC0 | (psid >> 16));
44 out[1] = (uint8_t)(psid >> 8);
45 out[2] = (uint8_t)psid;
52 out[0] = (uint8_t)(0xE0 | (psid >> 24));
53 out[1] = (uint8_t)(psid >> 16);
54 out[2] = (uint8_t)(psid >> 8);
55 out[3] = (uint8_t)psid;
59size_t pc_wave_decode_psid(
const uint8_t *in,
size_t len, uint32_t *psid)
61 if (!in || len < 1 || !psid)
71 if ((b0 & 0xC0) == 0x80)
77 *psid = (uint32_t)((b0 & 0x3F) << 8) | in[1];
80 if ((b0 & 0xE0) == 0xC0)
86 *psid = (uint32_t)((b0 & 0x1F) << 16) | ((uint32_t)in[1] << 8) | in[2];
89 if ((b0 & 0xF0) == 0xE0)
95 *psid = (uint32_t)((b0 & 0x0F) << 24) | ((uint32_t)in[1] << 16) | ((uint32_t)in[2] << 8) | in[3];
101size_t pc_wsmp_build(uint32_t psid,
const uint8_t *payload,
size_t payload_len, uint8_t *out,
size_t cap)
103 if (!out || (payload_len && !payload) || payload_len > 255)
112 out[i++] = Wave::WSMP_VERSION;
113 size_t p = pc_wave_encode_psid(psid, out + i, cap - i);
119 if (i + 1 + payload_len > cap)
123 out[i++] = (uint8_t)payload_len;
126 memcpy(out + i, payload, payload_len);
132bool pc_wsmp_parse(
const uint8_t *frame,
size_t len, WsmpFrame *out)
134 if (!frame || !out || len < 3)
138 if ((frame[0] & 0x0F) != Wave::WSMP_VERSION)
143 size_t p = pc_wave_decode_psid(frame + 1, len - 1, &psid);
153 uint8_t wlen = frame[off++];
154 if (off + wlen > len)
159 out->payload = wlen ? (frame + off) : nullptr;
160 out->payload_len = wlen;
164size_t pc_wave_1609dot2_wrap(uint8_t content_type,
const uint8_t *payload,
size_t payload_len, uint8_t *out,
size_t cap)
166 if (!out || (payload_len && !payload))
170 size_t n = 2 + payload_len;
175 out[0] = Wave::WAVE_16092_VERSION;
176 out[1] = content_type;
179 memcpy(out + 2, payload, payload_len);
IEEE 1609 WAVE (WSMP + 1609.2 security envelope) codec (PC_ENABLE_WAVE).