SE050 Driver
API reference
Loading...
Searching...
No Matches
se050_commands.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include "se050_apdu.hpp"
10#include "se050_tlv.hpp"
11#include "se050_types.hpp"
12
13#include <array>
14#include <cstddef>
15#include <cstring>
16#include <cstdint>
17
18namespace se050::cmd {
19
20inline constexpr std::uint8_t kClaNoSm = 0x80U;
21
22inline constexpr std::uint8_t kInsWrite = 0x01U;
23inline constexpr std::uint8_t kInsRead = 0x02U;
24inline constexpr std::uint8_t kInsCrypto = 0x03U;
25inline constexpr std::uint8_t kInsMgmt = 0x04U;
26
27inline constexpr std::uint8_t kP1Default = 0x00U;
28inline constexpr std::uint8_t kP1Aes = 0x03U;
29inline constexpr std::uint8_t kP1Binary = 0x06U;
30inline constexpr std::uint8_t kP1Signature = 0x0CU;
31inline constexpr std::uint8_t kP1Cipher = 0x0EU;
32inline constexpr std::uint8_t kP1Ec = 0x01U;
33inline constexpr std::uint8_t kP1KeyPair = 0x60U;
34
35inline constexpr std::uint8_t kP2Default = 0x00U;
36inline constexpr std::uint8_t kP2Version = 0x20U;
37inline constexpr std::uint8_t kP2Memory = 0x22U;
38inline constexpr std::uint8_t kP2DeleteObject = 0x28U;
39inline constexpr std::uint8_t kP2Random = 0x49U;
40inline constexpr std::uint8_t kP2Exist = 0x27U;
41inline constexpr std::uint8_t kP2Sign = 0x09U;
42inline constexpr std::uint8_t kP2Verify = 0x0AU;
43inline constexpr std::uint8_t kP2EncryptOneshot = 0x37U;
44inline constexpr std::uint8_t kP2DecryptOneshot = 0x38U;
45
46inline constexpr std::uint8_t kCipherAesEcbNopad = 0x0EU;
47
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;
52
53inline constexpr std::uint8_t kResultSuccess = 0x01U;
54
55using ObjectId = std::array<std::uint8_t, 4>;
56
57enum class MemoryType : std::uint8_t {
58 Persistent = 0x01,
59 TransientReset = 0x02,
60 TransientDeselect = 0x03,
61};
62
63enum class EcCurve : std::uint8_t {
64 NistP192 = 0x01,
65 NistP224 = 0x02,
66 NistP256 = 0x03,
67 NistP384 = 0x04,
68 NistP521 = 0x05,
69};
70
71enum class EcdsaAlgo : std::uint8_t {
72 Sha1 = 0x11,
73 Sha224 = 0x25,
74 Sha256 = 0x21,
75 Sha384 = 0x22,
76 Sha512 = 0x26,
77};
78
80 std::uint8_t applet_major{0};
81 std::uint8_t applet_minor{0};
82 std::uint8_t applet_patch{0};
83 std::uint16_t applet_config{0};
84 std::uint16_t secure_box{0};
85};
86
87[[nodiscard]] inline Error BuildGetVersion(std::uint8_t* out, std::size_t out_cap,
88 std::size_t* out_len) noexcept {
89 return apdu::BuildCase4Extended(kClaNoSm, kInsMgmt, kP1Default, kP2Version, nullptr, 0U, out, out_cap,
90 out_len);
91}
92
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) {
97 }
98 std::uint8_t payload[8]{};
99 std::size_t payload_len = 0;
100 const Error t = tlv::AppendU16Be(kTag1, random_len, payload, sizeof(payload), &payload_len);
101 if (t != Error::Ok) {
102 return t;
103 }
104 return apdu::BuildCase4Extended(kClaNoSm, kInsMgmt, kP1Default, kP2Random, payload, payload_len, out, out_cap,
105 out_len);
106}
107
108[[nodiscard]] inline Error BuildGetFreeMemory(MemoryType memory_type, std::uint8_t* out, std::size_t out_cap,
109 std::size_t* out_len) noexcept {
110 if (out_len == nullptr) {
112 }
113 std::uint8_t payload[8]{};
114 std::size_t payload_len = 0;
115 const Error t = tlv::AppendU8(kTag1, static_cast<std::uint8_t>(memory_type), payload, sizeof(payload),
116 &payload_len);
117 if (t != Error::Ok) {
118 return t;
119 }
120 return apdu::BuildCase4Extended(kClaNoSm, kInsMgmt, kP1Default, kP2Memory, payload, payload_len, out, out_cap,
121 out_len);
122}
123
124[[nodiscard]] inline Error BuildDeleteSecureObject(const ObjectId& object_id, std::uint8_t* out,
125 std::size_t out_cap, std::size_t* out_len) noexcept {
126 if (out_len == nullptr) {
128 }
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);
132 if (t != Error::Ok) {
133 return t;
134 }
135 return apdu::BuildCase4Extended(kClaNoSm, kInsMgmt, kP1Default, kP2DeleteObject, payload, payload_len, out,
136 out_cap, out_len);
137}
138
139[[nodiscard]] inline Error BuildCheckObjectExists(const ObjectId& object_id, std::uint8_t* out,
140 std::size_t out_cap, std::size_t* out_len) noexcept {
141 if (out_len == nullptr) {
143 }
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);
147 if (t != Error::Ok) {
148 return t;
149 }
150 /* CheckObjectExists is a management command: INS_MGMT 0x04 / P2_EXIST
151 * (AN12413; NXP Se05x_API_CheckObjectExists). With INS_READ the applet
152 * answers 0x6985 for every object, so "absent" could never be told from a
153 * fault (desk SE050C2, 2026-10-15). */
154 return apdu::BuildCase4Extended(kClaNoSm, kInsMgmt, kP1Default, kP2Exist, payload, payload_len, out, out_cap,
155 out_len);
156}
157
158[[nodiscard]] inline Error BuildGenerateEcKeyPair(const ObjectId& object_id, EcCurve curve, std::uint8_t* out,
159 std::size_t out_cap, std::size_t* out_len) noexcept {
160 if (out_len == nullptr) {
162 }
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);
166 if (t != Error::Ok) {
167 return t;
168 }
169 t = tlv::AppendU8(kTag2, static_cast<std::uint8_t>(curve), payload, sizeof(payload), &payload_len);
170 if (t != Error::Ok) {
171 return t;
172 }
173 return apdu::BuildCase4Extended(kClaNoSm, kInsWrite, static_cast<std::uint8_t>(kP1Ec | kP1KeyPair), kP2Default,
174 payload, payload_len, out, out_cap, out_len);
175}
176
177[[nodiscard]] inline Error BuildWriteBinary(const ObjectId& object_id, const std::uint8_t* data,
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)) {
183 }
184 std::uint8_t payload[kMaxApduCommandBytes]{};
185 std::size_t payload_len = 0;
186
187 Error t = tlv::Append(kTag1, object_id.data(), object_id.size(), payload, sizeof(payload), &payload_len);
188 if (t != Error::Ok) {
189 return t;
190 }
191 if (has_offset) {
192 t = tlv::AppendU16Be(kTag2, offset, payload, sizeof(payload), &payload_len);
193 if (t != Error::Ok) {
194 return t;
195 }
196 }
197 if (has_file_length) {
198 t = tlv::AppendU16Be(kTag3, file_length, payload, sizeof(payload), &payload_len);
199 if (t != Error::Ok) {
200 return t;
201 }
202 }
203 t = tlv::Append(0x44U, data, data_len, payload, sizeof(payload), &payload_len);
204 if (t != Error::Ok) {
205 return t;
206 }
207 return apdu::BuildCase4Extended(kClaNoSm, kInsWrite, kP1Binary, kP2Default, payload, payload_len, out, out_cap,
208 out_len);
209}
210
211[[nodiscard]] inline Error BuildWriteAesKey(const ObjectId& object_id, const std::uint8_t* key, std::size_t key_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)) {
215 }
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);
219 if (t != Error::Ok) {
220 return t;
221 }
222 t = tlv::Append(kTag3, key, key_len, payload, sizeof(payload), &payload_len);
223 if (t != Error::Ok) {
224 return t;
225 }
226 return apdu::BuildCase4Extended(kClaNoSm, kInsWrite, kP1Aes, kP2Default, payload, payload_len, out, out_cap,
227 out_len);
228}
229
230[[nodiscard]] inline Error BuildCipherOneShot(const ObjectId& key_id, bool decrypt, const std::uint8_t* data,
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)) {
235 }
236 std::uint8_t payload[64]{};
237 std::size_t payload_len = 0;
238 Error t = tlv::Append(kTag1, key_id.data(), key_id.size(), payload, sizeof(payload), &payload_len);
239 if (t != Error::Ok) {
240 return t;
241 }
242 t = tlv::AppendU8(kTag2, kCipherAesEcbNopad, payload, sizeof(payload), &payload_len);
243 if (t != Error::Ok) {
244 return t;
245 }
246 t = tlv::Append(kTag3, data, data_len, payload, sizeof(payload), &payload_len);
247 if (t != Error::Ok) {
248 return t;
249 }
250 const std::uint8_t p2 = decrypt ? kP2DecryptOneshot : kP2EncryptOneshot;
251 return apdu::BuildCase4Extended(kClaNoSm, kInsCrypto, kP1Cipher, p2, payload, payload_len, out, out_cap, out_len);
252}
253
254[[nodiscard]] inline Error BuildReadObject(const ObjectId& object_id, bool has_offset, std::uint16_t offset,
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) {
259 }
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);
263 if (t != Error::Ok) {
264 return t;
265 }
266 if (has_offset) {
267 t = tlv::AppendU16Be(kTag2, offset, payload, sizeof(payload), &payload_len);
268 if (t != Error::Ok) {
269 return t;
270 }
271 }
272 if (has_length) {
273 t = tlv::AppendU16Be(kTag3, length, payload, sizeof(payload), &payload_len);
274 if (t != Error::Ok) {
275 return t;
276 }
277 }
278 return apdu::BuildCase4Extended(kClaNoSm, kInsRead, kP1Default, kP2Default, payload, payload_len, out, out_cap,
279 out_len);
280}
281
282[[nodiscard]] inline Error BuildEcdsaSign(const ObjectId& key_id, EcdsaAlgo algo, const std::uint8_t* digest,
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)) {
287 }
288 std::uint8_t payload[128]{};
289 std::size_t payload_len = 0;
290 Error t = tlv::Append(kTag1, key_id.data(), key_id.size(), payload, sizeof(payload), &payload_len);
291 if (t != Error::Ok) {
292 return t;
293 }
294 t = tlv::AppendU8(kTag2, static_cast<std::uint8_t>(algo), payload, sizeof(payload), &payload_len);
295 if (t != Error::Ok) {
296 return t;
297 }
298 t = tlv::Append(kTag3, digest, digest_len, payload, sizeof(payload), &payload_len);
299 if (t != Error::Ok) {
300 return t;
301 }
302 return apdu::BuildCase4Extended(kClaNoSm, kInsCrypto, kP1Signature, kP2Sign, payload, payload_len, out, out_cap,
303 out_len);
304}
305
306[[nodiscard]] inline Error BuildEcdsaVerify(const ObjectId& key_id, EcdsaAlgo algo, const std::uint8_t* digest,
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)) {
313 }
314 std::uint8_t payload[256]{};
315 std::size_t payload_len = 0;
316 Error t = tlv::Append(kTag1, key_id.data(), key_id.size(), payload, sizeof(payload), &payload_len);
317 if (t != Error::Ok) {
318 return t;
319 }
320 t = tlv::AppendU8(kTag2, static_cast<std::uint8_t>(algo), payload, sizeof(payload), &payload_len);
321 if (t != Error::Ok) {
322 return t;
323 }
324 t = tlv::Append(kTag3, digest, digest_len, payload, sizeof(payload), &payload_len);
325 if (t != Error::Ok) {
326 return t;
327 }
328 t = tlv::Append(kTag5, signature, signature_len, payload, sizeof(payload), &payload_len);
329 if (t != Error::Ok) {
330 return t;
331 }
332 return apdu::BuildCase4Extended(kClaNoSm, kInsCrypto, kP1Signature, kP2Verify, payload, payload_len, out,
333 out_cap, out_len);
334}
335
336[[nodiscard]] inline Error ParseResponseTag1(const std::uint8_t* rapdu, std::size_t rapdu_len,
337 const std::uint8_t** value_out, std::size_t* value_len_out,
338 apdu::StatusWords* sw_out) noexcept {
339 if (value_out == nullptr || value_len_out == nullptr || sw_out == nullptr) {
341 }
342 const std::uint8_t* payload = nullptr;
343 std::size_t payload_len = 0;
344 const Error pe = apdu::ParseResponse(rapdu, rapdu_len, &payload, &payload_len, sw_out);
345 if (pe != Error::Ok) {
346 return pe;
347 }
348 if (!apdu::IsSuccess(*sw_out)) {
349 return Error::Protocol;
350 }
351 if (!tlv::FindFirst(kTag1, payload, payload_len, value_out, value_len_out)) {
352 return Error::Protocol;
353 }
354 return Error::Ok;
355}
356
357[[nodiscard]] inline Error ParseVersionInfo(const std::uint8_t* rapdu, std::size_t rapdu_len,
358 VersionInfo* out) noexcept {
359 if (out == nullptr) {
361 }
362 const std::uint8_t* v = nullptr;
363 std::size_t v_len = 0;
365 const Error e = ParseResponseTag1(rapdu, rapdu_len, &v, &v_len, &sw);
366 if (e != Error::Ok) {
367 return e;
368 }
369 if (v_len < 7U) {
370 return Error::Protocol;
371 }
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]);
377 return Error::Ok;
378}
379
380[[nodiscard]] inline Error ParseFreeMemory(const std::uint8_t* rapdu, std::size_t rapdu_len,
381 std::uint16_t* free_bytes) noexcept {
382 if (free_bytes == nullptr) {
384 }
385 const std::uint8_t* v = nullptr;
386 std::size_t v_len = 0;
388 const Error e = ParseResponseTag1(rapdu, rapdu_len, &v, &v_len, &sw);
389 if (e != Error::Ok) {
390 return e;
391 }
392 if (v_len != 2U) {
393 return Error::Protocol;
394 }
395 *free_bytes = static_cast<std::uint16_t>((static_cast<std::uint16_t>(v[0]) << 8U) | v[1]);
396 return Error::Ok;
397}
398
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) {
403 }
404 *out_len = 0;
405 const std::uint8_t* v = nullptr;
406 std::size_t v_len = 0;
408 const Error e = ParseResponseTag1(rapdu, rapdu_len, &v, &v_len, &sw);
409 if (e != Error::Ok) {
410 return e;
411 }
412 if (v_len > out_cap) {
414 }
415 if (v_len > 0U && out != nullptr) {
416 std::memcpy(out, v, v_len);
417 }
418 *out_len = v_len;
419 return Error::Ok;
420}
421
422[[nodiscard]] inline Error ParseVerifyResult(const std::uint8_t* rapdu, std::size_t rapdu_len,
423 bool* verified) noexcept {
424 if (verified == nullptr) {
426 }
427 *verified = false;
428 const std::uint8_t* v = nullptr;
429 std::size_t v_len = 0;
431 const Error e = ParseResponseTag1(rapdu, rapdu_len, &v, &v_len, &sw);
432 if (e != Error::Ok) {
433 return e;
434 }
435 if (v_len != 1U) {
436 return Error::Protocol;
437 }
438 *verified = (v[0] == kResultSuccess);
439 return Error::Ok;
440}
441
442[[nodiscard]] inline Error ParseObjectExistsResult(const std::uint8_t* rapdu, std::size_t rapdu_len,
443 bool* exists) noexcept {
444 if (exists == nullptr) {
446 }
447 *exists = false;
448 const std::uint8_t* v = nullptr;
449 std::size_t v_len = 0;
451 const Error e = ParseResponseTag1(rapdu, rapdu_len, &v, &v_len, &sw);
452 if (e != Error::Ok) {
453 return e;
454 }
455 if (v_len != 1U) {
456 return Error::Protocol;
457 }
458 *exists = (v[0] == kResultSuccess);
459 return Error::Ok;
460}
461
462} // namespace se050::cmd
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