23[[nodiscard]]
inline Error BuildCaseShort(std::uint8_t cla, std::uint8_t ins, std::uint8_t p1,
24 std::uint8_t p2,
const std::uint8_t* data,
25 std::uint8_t data_len,
bool le_present, std::uint8_t le,
26 std::uint8_t* out, std::size_t out_cap,
27 std::size_t* out_len)
noexcept;
47 std::uint8_t p2,
const std::uint8_t* data,
48 std::size_t data_len, std::uint8_t* out,
49 std::size_t out_cap, std::size_t* out_len)
noexcept {
50 if (out_len ==
nullptr) {
57 if (data_len <= 255U) {
70 return BuildCaseShort(cla, ins, p1, p2, data,
static_cast<std::uint8_t
>(data_len),
true, 0x00U,
71 out, out_cap, out_len);
73 constexpr std::size_t kHeader = 7U;
74 constexpr std::size_t kLeExt = 2U;
78 const std::size_t need = kHeader + data_len + kLeExt;
88 out[i++] =
static_cast<std::uint8_t
>((data_len >> 8) & 0xFFU);
89 out[i++] =
static_cast<std::uint8_t
>(data_len & 0xFFU);
90 if (data_len > 0U && data !=
nullptr) {
91 std::memcpy(out + i, data, data_len);
107 std::uint8_t p2,
const std::uint8_t* data,
108 std::uint8_t data_len,
bool le_present, std::uint8_t le,
109 std::uint8_t* out, std::size_t out_cap,
110 std::size_t* out_len)
noexcept {
111 if (out_len ==
nullptr) {
115 const std::size_t need = 5U + data_len + (le_present ? 1U : 0U);
116 if (need > out_cap) {
125 if (data_len > 0U && data !=
nullptr) {
126 std::memcpy(out + i, data, data_len);
145 const std::uint8_t** data_out, std::size_t* data_len_out,
147 if (data_out ==
nullptr || data_len_out ==
nullptr || sw_out ==
nullptr) {
154 *data_len_out = rsp_len - 2U;
155 sw_out->sw1 = rsp[rsp_len - 2U];
156 sw_out->sw2 = rsp[rsp_len - 1U];
162 return sw.sw1 == 0x90U && sw.sw2 == 0x00U;
Definition se050_apdu.hpp:15
Error BuildCase4Extended(std::uint8_t cla, std::uint8_t ins, std::uint8_t p1, std::uint8_t p2, const std::uint8_t *data, std::size_t data_len, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Build a CASE 4 command APDU with extended length encoding.
Definition se050_apdu.hpp:46
bool IsSuccess(const StatusWords &sw) noexcept
Return true when SW1 == 0x90 and SW2 == 0x00.
Definition se050_apdu.hpp:161
bool IsMoreData(const StatusWords &sw) noexcept
SW1 == 0x61 — more data available via GET RESPONSE (common GlobalPlatform pattern).
Definition se050_apdu.hpp:166
Error BuildCaseShort(std::uint8_t cla, std::uint8_t ins, std::uint8_t p1, std::uint8_t p2, const std::uint8_t *data, std::uint8_t data_len, bool le_present, std::uint8_t le, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Build a CASE 3/4 short command when data_len ≤ 255 and a 1-byte Le is enough.
Definition se050_apdu.hpp:106
Error ParseResponse(const std::uint8_t *rsp, std::size_t rsp_len, const std::uint8_t **data_out, std::size_t *data_len_out, StatusWords *sw_out) noexcept
Parse a simple R-APDU: optional response data followed by SW1 SW2.
Definition se050_apdu.hpp:144
Error
Definition se050_types.hpp:14
constexpr std::size_t kMaxApduCommandBytes
Definition se050_types.hpp:40
Shared types, limits, and error codes for the HF-SE050 driver.
Parsed status words from a response APDU.
Definition se050_apdu.hpp:18
std::uint8_t sw2
Definition se050_apdu.hpp:20
std::uint8_t sw1
Definition se050_apdu.hpp:19