28inline constexpr std::uint8_t
kP1Aes = 0x03U;
32inline constexpr std::uint8_t
kP1Ec = 0x01U;
41inline constexpr std::uint8_t
kP2Sign = 0x09U;
48inline constexpr std::uint8_t
kTag1 = 0x41U;
49inline constexpr std::uint8_t
kTag2 = 0x42U;
50inline constexpr std::uint8_t
kTag3 = 0x43U;
51inline constexpr std::uint8_t
kTag5 = 0x45U;
88 std::size_t* out_len)
noexcept {
93[[nodiscard]]
inline Error BuildGetRandom(std::uint16_t random_len, std::uint8_t* out, std::size_t out_cap,
94 std::size_t* out_len)
noexcept {
95 if (out_len ==
nullptr) {
98 std::uint8_t payload[8]{};
99 std::size_t payload_len = 0;
109 std::size_t* out_len)
noexcept {
110 if (out_len ==
nullptr) {
113 std::uint8_t payload[8]{};
114 std::size_t payload_len = 0;
125 std::size_t out_cap, std::size_t* out_len)
noexcept {
126 if (out_len ==
nullptr) {
129 std::uint8_t payload[12]{};
130 std::size_t payload_len = 0;
131 const Error t =
tlv::Append(
kTag1, object_id.data(), object_id.size(), payload,
sizeof(payload), &payload_len);
140 std::size_t out_cap, std::size_t* out_len)
noexcept {
141 if (out_len ==
nullptr) {
144 std::uint8_t payload[12]{};
145 std::size_t payload_len = 0;
146 const Error t =
tlv::Append(
kTag1, object_id.data(), object_id.size(), payload,
sizeof(payload), &payload_len);
159 std::size_t out_cap, std::size_t* out_len)
noexcept {
160 if (out_len ==
nullptr) {
163 std::uint8_t payload[16]{};
164 std::size_t payload_len = 0;
165 Error t =
tlv::Append(
kTag1, object_id.data(), object_id.size(), payload,
sizeof(payload), &payload_len);
169 t =
tlv::AppendU8(
kTag2,
static_cast<std::uint8_t
>(curve), payload,
sizeof(payload), &payload_len);
174 payload, payload_len, out, out_cap, out_len);
178 std::size_t data_len,
bool has_offset, std::uint16_t offset,
179 bool has_file_length, std::uint16_t file_length, std::uint8_t* out,
180 std::size_t out_cap, std::size_t* out_len)
noexcept {
181 if (out_len ==
nullptr || (data_len > 0U && data ==
nullptr)) {
185 std::size_t payload_len = 0;
187 Error t =
tlv::Append(
kTag1, object_id.data(), object_id.size(), payload,
sizeof(payload), &payload_len);
197 if (has_file_length) {
203 t =
tlv::Append(0x44U, data, data_len, payload,
sizeof(payload), &payload_len);
212 std::uint8_t* out, std::size_t out_cap, std::size_t* out_len)
noexcept {
213 if (out_len ==
nullptr || key ==
nullptr || (key_len != 16U && key_len != 24U && key_len != 32U)) {
216 std::uint8_t payload[48]{};
217 std::size_t payload_len = 0;
218 Error t =
tlv::Append(
kTag1, object_id.data(), object_id.size(), payload,
sizeof(payload), &payload_len);
222 t =
tlv::Append(
kTag3, key, key_len, payload,
sizeof(payload), &payload_len);
231 std::size_t data_len, std::uint8_t* out, std::size_t out_cap,
232 std::size_t* out_len)
noexcept {
233 if (out_len ==
nullptr || (data_len > 0U && data ==
nullptr)) {
236 std::uint8_t payload[64]{};
237 std::size_t payload_len = 0;
246 t =
tlv::Append(
kTag3, data, data_len, payload,
sizeof(payload), &payload_len);
255 bool has_length, std::uint16_t length, std::uint8_t* out,
256 std::size_t out_cap, std::size_t* out_len)
noexcept {
257 if (out_len ==
nullptr) {
260 std::uint8_t payload[32]{};
261 std::size_t payload_len = 0;
262 Error t =
tlv::Append(
kTag1, object_id.data(), object_id.size(), payload,
sizeof(payload), &payload_len);
283 std::size_t digest_len, std::uint8_t* out, std::size_t out_cap,
284 std::size_t* out_len)
noexcept {
285 if (out_len ==
nullptr || (digest_len > 0U && digest ==
nullptr)) {
288 std::uint8_t payload[128]{};
289 std::size_t payload_len = 0;
294 t =
tlv::AppendU8(
kTag2,
static_cast<std::uint8_t
>(algo), payload,
sizeof(payload), &payload_len);
298 t =
tlv::Append(
kTag3, digest, digest_len, payload,
sizeof(payload), &payload_len);
307 std::size_t digest_len,
const std::uint8_t* signature,
308 std::size_t signature_len, std::uint8_t* out, std::size_t out_cap,
309 std::size_t* out_len)
noexcept {
310 if (out_len ==
nullptr || (digest_len > 0U && digest ==
nullptr) ||
311 (signature_len > 0U && signature ==
nullptr)) {
314 std::uint8_t payload[256]{};
315 std::size_t payload_len = 0;
320 t =
tlv::AppendU8(
kTag2,
static_cast<std::uint8_t
>(algo), payload,
sizeof(payload), &payload_len);
324 t =
tlv::Append(
kTag3, digest, digest_len, payload,
sizeof(payload), &payload_len);
328 t =
tlv::Append(
kTag5, signature, signature_len, payload,
sizeof(payload), &payload_len);
337 const std::uint8_t** value_out, std::size_t* value_len_out,
339 if (value_out ==
nullptr || value_len_out ==
nullptr || sw_out ==
nullptr) {
342 const std::uint8_t* payload =
nullptr;
343 std::size_t payload_len = 0;
359 if (out ==
nullptr) {
362 const std::uint8_t* v =
nullptr;
363 std::size_t v_len = 0;
372 out->applet_major = v[0];
373 out->applet_minor = v[1];
374 out->applet_patch = v[2];
375 out->applet_config =
static_cast<std::uint16_t
>((
static_cast<std::uint16_t
>(v[3]) << 8U) | v[4]);
376 out->secure_box =
static_cast<std::uint16_t
>((
static_cast<std::uint16_t
>(v[5]) << 8U) | v[6]);
381 std::uint16_t* free_bytes)
noexcept {
382 if (free_bytes ==
nullptr) {
385 const std::uint8_t* v =
nullptr;
386 std::size_t v_len = 0;
395 *free_bytes =
static_cast<std::uint16_t
>((
static_cast<std::uint16_t
>(v[0]) << 8U) | v[1]);
399[[nodiscard]]
inline Error ParseDataTag1(
const std::uint8_t* rapdu, std::size_t rapdu_len, std::uint8_t* out,
400 std::size_t out_cap, std::size_t* out_len)
noexcept {
401 if (out_len ==
nullptr) {
405 const std::uint8_t* v =
nullptr;
406 std::size_t v_len = 0;
412 if (v_len > out_cap) {
415 if (v_len > 0U && out !=
nullptr) {
416 std::memcpy(out, v, v_len);
423 bool* verified)
noexcept {
424 if (verified ==
nullptr) {
428 const std::uint8_t* v =
nullptr;
429 std::size_t v_len = 0;
443 bool* exists)
noexcept {
444 if (exists ==
nullptr) {
448 const std::uint8_t* v =
nullptr;
449 std::size_t v_len = 0;
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
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
Definition se050_commands.hpp:18
constexpr std::uint8_t kInsMgmt
Definition se050_commands.hpp:25
constexpr std::uint8_t kInsCrypto
Definition se050_commands.hpp:24
constexpr std::uint8_t kP1Signature
Definition se050_commands.hpp:30
Error ParseResponseTag1(const std::uint8_t *rapdu, std::size_t rapdu_len, const std::uint8_t **value_out, std::size_t *value_len_out, apdu::StatusWords *sw_out) noexcept
Definition se050_commands.hpp:336
Error BuildEcdsaSign(const ObjectId &key_id, EcdsaAlgo algo, const std::uint8_t *digest, std::size_t digest_len, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:282
Error ParseDataTag1(const std::uint8_t *rapdu, std::size_t rapdu_len, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:399
constexpr std::uint8_t kP2Version
Definition se050_commands.hpp:36
constexpr std::uint8_t kP2DecryptOneshot
Definition se050_commands.hpp:44
constexpr std::uint8_t kClaNoSm
Definition se050_commands.hpp:20
constexpr std::uint8_t kTag5
Definition se050_commands.hpp:51
Error BuildCipherOneShot(const ObjectId &key_id, bool decrypt, 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
Definition se050_commands.hpp:230
constexpr std::uint8_t kP1Aes
Definition se050_commands.hpp:28
Error BuildGetRandom(std::uint16_t random_len, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:93
Error BuildGetFreeMemory(MemoryType memory_type, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:108
constexpr std::uint8_t kP2EncryptOneshot
Definition se050_commands.hpp:43
Error ParseFreeMemory(const std::uint8_t *rapdu, std::size_t rapdu_len, std::uint16_t *free_bytes) noexcept
Definition se050_commands.hpp:380
Error ParseVerifyResult(const std::uint8_t *rapdu, std::size_t rapdu_len, bool *verified) noexcept
Definition se050_commands.hpp:422
constexpr std::uint8_t kP2Default
Definition se050_commands.hpp:35
constexpr std::uint8_t kP2DeleteObject
Definition se050_commands.hpp:38
Error BuildReadObject(const ObjectId &object_id, bool has_offset, std::uint16_t offset, bool has_length, std::uint16_t length, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:254
MemoryType
Definition se050_commands.hpp:57
constexpr std::uint8_t kInsWrite
Definition se050_commands.hpp:22
constexpr std::uint8_t kTag2
Definition se050_commands.hpp:49
constexpr std::uint8_t kP1Default
Definition se050_commands.hpp:27
Error BuildWriteBinary(const ObjectId &object_id, const std::uint8_t *data, std::size_t data_len, bool has_offset, std::uint16_t offset, bool has_file_length, std::uint16_t file_length, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:177
EcCurve
Definition se050_commands.hpp:63
constexpr std::uint8_t kP1Ec
Definition se050_commands.hpp:32
constexpr std::uint8_t kTag3
Definition se050_commands.hpp:50
constexpr std::uint8_t kP2Random
Definition se050_commands.hpp:39
constexpr std::uint8_t kP1KeyPair
Definition se050_commands.hpp:33
Error ParseVersionInfo(const std::uint8_t *rapdu, std::size_t rapdu_len, VersionInfo *out) noexcept
Definition se050_commands.hpp:357
std::array< std::uint8_t, 4 > ObjectId
Definition se050_commands.hpp:55
Error BuildGetVersion(std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:87
Error ParseObjectExistsResult(const std::uint8_t *rapdu, std::size_t rapdu_len, bool *exists) noexcept
Definition se050_commands.hpp:442
constexpr std::uint8_t kResultSuccess
Definition se050_commands.hpp:53
constexpr std::uint8_t kTag1
Definition se050_commands.hpp:48
constexpr std::uint8_t kP1Cipher
Definition se050_commands.hpp:31
constexpr std::uint8_t kP2Exist
Definition se050_commands.hpp:40
constexpr std::uint8_t kCipherAesEcbNopad
Definition se050_commands.hpp:46
constexpr std::uint8_t kP2Sign
Definition se050_commands.hpp:41
EcdsaAlgo
Definition se050_commands.hpp:71
Error BuildWriteAesKey(const ObjectId &object_id, const std::uint8_t *key, std::size_t key_len, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:211
Error BuildGenerateEcKeyPair(const ObjectId &object_id, EcCurve curve, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:158
Error BuildDeleteSecureObject(const ObjectId &object_id, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:124
constexpr std::uint8_t kP2Memory
Definition se050_commands.hpp:37
Error BuildCheckObjectExists(const ObjectId &object_id, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:139
Error BuildEcdsaVerify(const ObjectId &key_id, EcdsaAlgo algo, const std::uint8_t *digest, std::size_t digest_len, const std::uint8_t *signature, std::size_t signature_len, std::uint8_t *out, std::size_t out_cap, std::size_t *out_len) noexcept
Definition se050_commands.hpp:306
constexpr std::uint8_t kP2Verify
Definition se050_commands.hpp:42
constexpr std::uint8_t kInsRead
Definition se050_commands.hpp:23
constexpr std::uint8_t kP1Binary
Definition se050_commands.hpp:29
Error Append(std::uint8_t tag, const std::uint8_t *value, std::size_t value_len, std::uint8_t *out, std::size_t out_cap, std::size_t *off) noexcept
Definition se050_tlv.hpp:53
Error AppendU16Be(std::uint8_t tag, std::uint16_t value, std::uint8_t *out, std::size_t out_cap, std::size_t *off) noexcept
Definition se050_tlv.hpp:74
Error AppendU8(std::uint8_t tag, std::uint8_t value, std::uint8_t *out, std::size_t out_cap, std::size_t *off) noexcept
Definition se050_tlv.hpp:69
bool FindFirst(std::uint8_t wanted_tag, const std::uint8_t *tlv_data, std::size_t tlv_len, const std::uint8_t **value_out, std::size_t *value_len_out) noexcept
Definition se050_tlv.hpp:103
Error
Definition se050_types.hpp:14
constexpr std::size_t kMaxApduCommandBytes
Definition se050_types.hpp:40
ISO 7816-4 C-APDU packing and R-APDU parsing helpers (short + extended length).
Minimal BER-TLV helpers used by SE050 command payloads and responses.
Shared types, limits, and error codes for the HF-SE050 driver.
Parsed status words from a response APDU.
Definition se050_apdu.hpp:18
Definition se050_commands.hpp:79
std::uint8_t applet_major
Definition se050_commands.hpp:80
std::uint16_t secure_box
Definition se050_commands.hpp:84
std::uint8_t applet_minor
Definition se050_commands.hpp:81
std::uint16_t applet_config
Definition se050_commands.hpp:83
std::uint8_t applet_patch
Definition se050_commands.hpp:82