17bool apdu_parse(
const uint8_t *raw,
size_t raw_len, apdu_t *apdu) {
18 if (!raw || !apdu || raw_len < 4) {
22 memset(apdu, 0,
sizeof(apdu_t));
40 if (raw[pos] == 0x00 && raw_len > 7) {
41 apdu->extended =
true;
44 if (pos + 3 <= raw_len) {
45 apdu->lc =
static_cast<uint16_t
>((raw[pos + 1] << 8) | raw[pos + 2]);
49 apdu->extended =
false;
55 apdu->le = raw[pos] == 0 ? 256 : raw[pos];
66 if (pos + apdu->lc > raw_len) {
69 apdu->data = raw + pos;
77 if (pos + 2 <= raw_len) {
78 uint16_t le_val =
static_cast<uint16_t
>((raw[pos] << 8) | raw[pos + 1]);
79 apdu->le = (le_val == 0) ? 65536 : le_val;
83 apdu->le = (raw[pos] == 0) ? 256 : raw[pos];
bool apdu_parse(const uint8_t *raw, size_t raw_len, apdu_t *apdu)
ISO 7816 APDU parsing/building helpers for CDC Badge OpenPGP stack.
size_t apdu_build_response(uint8_t *buf, size_t buf_max, const uint8_t *data, size_t data_len, uint16_t sw)
Builds APDU response payload with status word trailer.