Skip to content

Commit 2b31619

Browse files
Merge pull request #601 from LedgerHQ/cev/apex_port
Add Apex devices for LedgerPKI
2 parents f2d76e5 + 7575de8 commit 2b31619

File tree

2 files changed

+48
-34
lines changed

2 files changed

+48
-34
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.25.3] 2025-08-11
9+
10+
### Fix
11+
12+
- Add missing definitions for LedgerPKI (including Apex devices)
13+
814
## [0.25.2] 2025-07-28
915

1016
### Changed

src/bolos/os_pki.h

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,45 @@
55
#include <stddef.h>
66
#include <stdint.h>
77

8+
// clang-format off
89
/** Certificate field with a variable length */
9-
#define CERTIFICATE_FIELD_VAR_LEN (0xFF)
10+
#define CERTIFICATE_FIELD_VAR_LEN (0xFF)
1011
/** Certificate field with a non predefined value */
11-
#define CERTIFICATE_FIELD_UNKNOWN_VALUE (0xFFFFFFFF)
12+
#define CERTIFICATE_FIELD_UNKNOWN_VALUE (0xFFFFFFFF)
1213
/** Certificate validity index minimum value */
13-
#define CERTIFICATE_VALIDITY_INDEX (0x00000001)
14+
#define CERTIFICATE_VALIDITY_INDEX (0x00000001)
1415
/** Certificate structure type */
1516
#define CERTIFICATE_STRUCTURE_TYPE_CERTIFICATE (0x01)
1617
/** Maximum certificate trusted name length */
17-
#define CERTIFICATE_TRUSTED_NAME_MAXLEN (32)
18+
#define CERTIFICATE_TRUSTED_NAME_MAXLEN (32)
1819

1920
// Fake OS version
2021
#define VERSION "1.0.0"
2122

2223
/** Certificate tags associated to each certificate field */
23-
// clang-format off
2424
typedef enum {
25-
CERTIFICATE_TAG_STRUCTURE_TYPE = 0x01, ///< Structure type
26-
CERTIFICATE_TAG_VERSION = 0x02, ///< Certificate version
27-
CERTIFICATE_TAG_VALIDITY = 0x10, ///< Certificate validity
28-
CERTIFICATE_TAG_VALIDITY_INDEX = 0x11, ///< Certificate validity index
29-
CERTIFICATE_TAG_CHALLENGE = 0x12, ///< Challenge value
30-
CERTIFICATE_TAG_SIGNER_KEY_ID = 0x13, ///< Signer key ID
31-
CERTIFICATE_TAG_SIGN_ALGO_ID = 0x14, ///< Signature algorithm with the signer key
32-
CERTIFICATE_TAG_SIGNATURE = 0x15, ///< Signature
33-
CERTIFICATE_TAG_TIME_VALIDITY = 0x16, ///< Time validity
34-
CERTIFICATE_TAG_TRUSTED_NAME = 0x20, ///< Trusted name
35-
CERTIFICATE_TAG_PUBLIC_KEY_ID = 0x30, ///< Public key ID
36-
CERTIFICATE_TAG_PUBLIC_KEY_USAGE = 0x31, ///< Public key usage
37-
CERTIFICATE_TAG_PUBLIC_KEY_CURVE_ID = 0x32, ///< Curve ID on which the public key is defined
38-
CERTIFICATE_TAG_COMPRESSED_PUBLIC_KEY = 0x33, ///< Public key in compressed form
39-
CERTIFICATE_TAG_PK_SIGN_ALGO_ID = 0x34, ///< Signature algorithm with the public key
40-
CERTIFICATE_TAG_TARGET_DEVICE = 0x35, ///< Target device
41-
CERTIFICATE_TAG_DEPTH = 0x36 ///< Certificate depth
25+
CERTIFICATE_TAG_STRUCTURE_TYPE = 0x01, ///< Structure type
26+
CERTIFICATE_TAG_VERSION = 0x02, ///< Certificate version
27+
CERTIFICATE_TAG_VALIDITY = 0x10, ///< Certificate validity
28+
CERTIFICATE_TAG_VALIDITY_INDEX = 0x11, ///< Certificate validity index
29+
CERTIFICATE_TAG_CHALLENGE = 0x12, ///< Challenge value
30+
CERTIFICATE_TAG_SIGNER_KEY_ID = 0x13, ///< Signer key ID
31+
CERTIFICATE_TAG_SIGN_ALGO_ID = 0x14, ///< Signature algorithm with the signer key
32+
CERTIFICATE_TAG_SIGNATURE = 0x15, ///< Signature
33+
CERTIFICATE_TAG_TIME_VALIDITY = 0x16, ///< Time validity
34+
CERTIFICATE_TAG_TRUSTED_NAME = 0x20, ///< Trusted name
35+
CERTIFICATE_TAG_PUBLIC_KEY_ID = 0x30, ///< Public key ID
36+
CERTIFICATE_TAG_PUBLIC_KEY_USAGE = 0x31, ///< Public key usage
37+
CERTIFICATE_TAG_PUBLIC_KEY_CURVE_ID = 0x32, ///< Curve ID on which the public key is defined
38+
CERTIFICATE_TAG_COMPRESSED_PUBLIC_KEY = 0x33, ///< Public key in compressed form
39+
CERTIFICATE_TAG_PK_SIGN_ALGO_ID = 0x34, ///< Signature algorithm with the public key
40+
CERTIFICATE_TAG_TARGET_DEVICE = 0x35, ///< Target device
41+
CERTIFICATE_TAG_DEPTH = 0x36 ///< Certificate depth
4242
} os_pki_tag_t;
43-
// clang-format on
4443

4544
/** Certificate version possible values */
4645
enum {
47-
CERTIFICATE_VERSION_02 = 0x02, ///< Certificate version 2
46+
CERTIFICATE_VERSION_02 = 0x02, ///< Certificate version 2
4847
CERTIFICATE_VERSION_UNKNOWN
4948
};
5049

@@ -58,16 +57,19 @@ enum {
5857
CERTIFICATE_KEY_ID_PARTNER_METADATA,
5958
CERTIFICATE_KEY_ID_ERC20_METADATA,
6059
CERTIFICATE_KEY_ID_DOMAIN_METADATA,
60+
CERTIFICATE_KEY_ID_CAL_CALLDATA,
61+
CERTIFICATE_KEY_ID_CAL_TRUSTED_NAME,
62+
CERTIFICATE_KEY_ID_CAL_NETWORK,
6163
CERTIFICATE_KEY_ID_UNKNOWN
6264
};
6365

6466
/** Signature algorithm possible values */
6567
enum {
66-
CERTIFICATE_SIGN_ALGO_ID_ECDSA_SHA256 = 0x01,
67-
CERTIFICATE_SIGN_ALGO_ID_ECDSA_SHA3_256 = 0x02,
68+
CERTIFICATE_SIGN_ALGO_ID_ECDSA_SHA256 = 0x01,
69+
CERTIFICATE_SIGN_ALGO_ID_ECDSA_SHA3_256 = 0x02,
6870
CERTIFICATE_SIGN_ALGO_ID_ECDSA_KECCAK_256 = 0x03,
69-
CERTIFICATE_SIGN_ALGO_ID_ECDSA_RIPEMD160 = 0x04,
70-
CERTIFICATE_SIGN_ALGO_ID_EDDSA_SHA512 = 0x10,
71+
CERTIFICATE_SIGN_ALGO_ID_ECDSA_RIPEMD160 = 0x04,
72+
CERTIFICATE_SIGN_ALGO_ID_EDDSA_SHA512 = 0x10,
7173
CERTIFICATE_SIGN_ALGO_ID_UNKNOWN
7274
};
7375

@@ -82,6 +84,11 @@ enum {
8284
CERTIFICATE_PUBLIC_KEY_USAGE_PLUGIN_METADATA,
8385
CERTIFICATE_PUBLIC_KEY_USAGE_COIN_META,
8486
CERTIFICATE_PUBLIC_KEY_USAGE_SEED_ID_AUTH,
87+
CERTIFICATE_PUBLIC_KEY_USAGE_TX_SIMU_SIGNER,
88+
CERTIFICATE_PUBLIC_KEY_USAGE_CALLDATA,
89+
CERTIFICATE_PUBLIC_KEY_USAGE_NETWORK,
90+
CERTIFICATE_PUBLIC_KEY_USAGE_SWAP_TEMPLATE,
91+
CERTIFICATE_PUBLIC_KEY_USAGE_LES_MULTISIG,
8592
CERTIFICATE_PUBLIC_KEY_USAGE_UNKNOWN,
8693
};
8794

@@ -92,6 +99,8 @@ enum {
9299
CERTIFICATE_TARGET_DEVICE_NANOSP,
93100
CERTIFICATE_TARGET_DEVICE_STAX,
94101
CERTIFICATE_TARGET_DEVICE_FLEX,
102+
CERTIFICATE_TARGET_DEVICE_APEX_P,
103+
CERTIFICATE_TARGET_DEVICE_APEX_M,
95104
CERTIFICATE_TARGET_DEVICE_UNKNOWN
96105
};
97106

@@ -101,7 +110,6 @@ typedef struct {
101110
uint8_t field_len;
102111
} os_pki_certificate_tag_info_t;
103112

104-
// clang-format off
105113
/** Array of field length and field maximum value corresponding to each tag */
106114
static const os_pki_certificate_tag_info_t C_os_pki_certificate_tag_info[] = {
107115
[CERTIFICATE_TAG_STRUCTURE_TYPE] = {CERTIFICATE_STRUCTURE_TYPE_CERTIFICATE, 0x01 },
@@ -122,15 +130,15 @@ static const os_pki_certificate_tag_info_t C_os_pki_certificate_tag_info[] = {
122130
[CERTIFICATE_TAG_SIGNATURE] = {CERTIFICATE_FIELD_UNKNOWN_VALUE, CERTIFICATE_FIELD_VAR_LEN},
123131
[CERTIFICATE_TAG_DEPTH] = {CERTIFICATE_FIELD_UNKNOWN_VALUE, 0x01 },
124132
};
125-
// clang-format on
126133

127134
static const cx_md_t C_os_sign_algo_hash_info[] = {
128-
[CERTIFICATE_SIGN_ALGO_ID_ECDSA_SHA256] = CX_SHA256,
129-
[CERTIFICATE_SIGN_ALGO_ID_ECDSA_SHA3_256] = CX_SHA3_256,
135+
[CERTIFICATE_SIGN_ALGO_ID_ECDSA_SHA256] = CX_SHA256,
136+
[CERTIFICATE_SIGN_ALGO_ID_ECDSA_SHA3_256] = CX_SHA3_256,
130137
[CERTIFICATE_SIGN_ALGO_ID_ECDSA_KECCAK_256] = CX_KECCAK,
131-
[CERTIFICATE_SIGN_ALGO_ID_ECDSA_RIPEMD160] = CX_RIPEMD160,
132-
[CERTIFICATE_SIGN_ALGO_ID_EDDSA_SHA512] = CX_SHA512
138+
[CERTIFICATE_SIGN_ALGO_ID_ECDSA_RIPEMD160] = CX_RIPEMD160,
139+
[CERTIFICATE_SIGN_ALGO_ID_EDDSA_SHA512] = CX_SHA512
133140
};
141+
// clang-format on
134142

135143
uint32_t sys_os_pki_load_certificate(uint8_t expected_key_usage,
136144
uint8_t *certificate,

0 commit comments

Comments
 (0)