Skip to content

Commit ccd8c72

Browse files
feat(esptool): Print key_purpose name for get_security_info cmd
1 parent 6bb2b92 commit ccd8c72

File tree

14 files changed

+218
-21
lines changed

14 files changed

+218
-21
lines changed

esptool/cmds.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1284,7 +1284,16 @@ def get_security_info(esp, args):
12841284
print(title)
12851285
print("=" * len(title))
12861286
print("Flags: {:#010x} ({})".format(si["flags"], bin(si["flags"])))
1287-
print("Key Purposes: {}".format(si["key_purposes"]))
1287+
if esp.KEY_PURPOSES:
1288+
print(f"Key Purposes: {si['key_purposes']}")
1289+
desc = "\n ".join(
1290+
[
1291+
f"BLOCK_KEY{key_num} - {esp.KEY_PURPOSES.get(purpose, 'UNKNOWN')}"
1292+
for key_num, purpose in enumerate(si["key_purposes"])
1293+
if key_num <= esp.EFUSE_MAX_KEY
1294+
]
1295+
)
1296+
print(f" {desc}")
12881297
if si["chip_id"] is not None and si["api_version"] is not None:
12891298
print("Chip ID: {}".format(si["chip_id"]))
12901299
print("API Version: {}".format(si["api_version"]))

esptool/targets/esp32.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import struct
77
import time
8-
from typing import Optional
8+
from typing import Dict, Optional
99

1010
from ..loader import ESPLoader
1111
from ..util import FatalError, NotSupportedError
@@ -125,6 +125,8 @@ class ESP32ROM(ESPLoader):
125125

126126
UF2_FAMILY_ID = 0x1C5F21B0
127127

128+
KEY_PURPOSES: Dict[int, str] = {}
129+
128130
""" Try to read the BLOCK1 (encryption key) and check if it is valid """
129131

130132
def is_flash_encryption_key_valid(self):

esptool/targets/esp32c2.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import struct
77
import time
8+
from typing import Dict
89

910
from .esp32c3 import ESP32C3ROM
1011
from ..loader import ESPLoader
@@ -64,6 +65,8 @@ class ESP32C2ROM(ESP32C3ROM):
6465

6566
UF2_FAMILY_ID = 0x2B88D29C
6667

68+
KEY_PURPOSES: Dict[int, str] = {}
69+
6770
def get_pkg_version(self):
6871
num_word = 1
6972
return (self.read_reg(self.EFUSE_BLOCK2_ADDR + (4 * num_word)) >> 22) & 0x07

esptool/targets/esp32c3.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# SPDX-License-Identifier: GPL-2.0-or-later
55

66
import struct
7+
from typing import Dict
78

89
from .esp32 import ESP32ROM
910
from ..loader import ESPLoader
@@ -99,6 +100,20 @@ class ESP32C3ROM(ESP32ROM):
99100

100101
UF2_FAMILY_ID = 0xD42BA06C
101102

103+
EFUSE_MAX_KEY = 5
104+
KEY_PURPOSES: Dict[int, str] = {
105+
0: "USER/EMPTY",
106+
1: "RESERVED",
107+
4: "XTS_AES_128_KEY",
108+
5: "HMAC_DOWN_ALL",
109+
6: "HMAC_DOWN_JTAG",
110+
7: "HMAC_DOWN_DIGITAL_SIGNATURE",
111+
8: "HMAC_UP",
112+
9: "SECURE_BOOT_DIGEST0",
113+
10: "SECURE_BOOT_DIGEST1",
114+
11: "SECURE_BOOT_DIGEST2",
115+
}
116+
102117
def get_pkg_version(self):
103118
num_word = 3
104119
return (self.read_reg(self.EFUSE_BLOCK1_ADDR + (4 * num_word)) >> 21) & 0x07
@@ -179,8 +194,10 @@ def get_secure_boot_enabled(self):
179194
)
180195

181196
def get_key_block_purpose(self, key_block):
182-
if key_block < 0 or key_block > 5:
183-
raise FatalError("Valid key block numbers must be in range 0-5")
197+
if key_block < 0 or key_block > self.EFUSE_MAX_KEY:
198+
raise FatalError(
199+
f"Valid key block numbers must be in range 0-{self.EFUSE_MAX_KEY}"
200+
)
184201

185202
reg, shift = [
186203
(self.EFUSE_PURPOSE_KEY0_REG, self.EFUSE_PURPOSE_KEY0_SHIFT),
@@ -194,7 +211,9 @@ def get_key_block_purpose(self, key_block):
194211

195212
def is_flash_encryption_key_valid(self):
196213
# Need to see an AES-128 key
197-
purposes = [self.get_key_block_purpose(b) for b in range(6)]
214+
purposes = [
215+
self.get_key_block_purpose(b) for b in range(self.EFUSE_MAX_KEY + 1)
216+
]
198217

199218
return any(p == self.PURPOSE_VAL_XTS_AES128_KEY for p in purposes)
200219

esptool/targets/esp32c5.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import struct
66
import time
7+
from typing import Dict
78

89
from .esp32c6 import ESP32C6ROM
910
from ..loader import ESPLoader
@@ -52,6 +53,23 @@ class ESP32C5ROM(ESP32C6ROM):
5253

5354
UF2_FAMILY_ID = 0xF71C0343
5455

56+
EFUSE_MAX_KEY = 5
57+
KEY_PURPOSES: Dict[int, str] = {
58+
0: "USER/EMPTY",
59+
1: "ECDSA_KEY",
60+
2: "XTS_AES_256_KEY_1",
61+
3: "XTS_AES_256_KEY_2",
62+
4: "XTS_AES_128_KEY",
63+
5: "HMAC_DOWN_ALL",
64+
6: "HMAC_DOWN_JTAG",
65+
7: "HMAC_DOWN_DIGITAL_SIGNATURE",
66+
8: "HMAC_UP",
67+
9: "SECURE_BOOT_DIGEST0",
68+
10: "SECURE_BOOT_DIGEST1",
69+
11: "SECURE_BOOT_DIGEST2",
70+
12: "KM_INIT_KEY",
71+
}
72+
5573
def get_chip_description(self):
5674
chip_name = {
5775
0: "ESP32-C5",

esptool/targets/esp32c5beta3.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import struct
66
import time
7+
from typing import Dict
78

89
from .esp32c6 import ESP32C6ROM
910
from ..loader import ESPLoader
@@ -41,6 +42,23 @@ class ESP32C5BETA3ROM(ESP32C6ROM):
4142
[0x600FE000, 0x60100000, "MEM_INTERNAL2"],
4243
]
4344

45+
EFUSE_MAX_KEY = 5
46+
KEY_PURPOSES: Dict[int, str] = {
47+
0: "USER/EMPTY",
48+
1: "ECDSA_KEY",
49+
2: "XTS_AES_256_KEY_1",
50+
3: "XTS_AES_256_KEY_2",
51+
4: "XTS_AES_128_KEY",
52+
5: "HMAC_DOWN_ALL",
53+
6: "HMAC_DOWN_JTAG",
54+
7: "HMAC_DOWN_DIGITAL_SIGNATURE",
55+
8: "HMAC_UP",
56+
9: "SECURE_BOOT_DIGEST0",
57+
10: "SECURE_BOOT_DIGEST1",
58+
11: "SECURE_BOOT_DIGEST2",
59+
12: "KM_INIT_KEY",
60+
}
61+
4462
def get_chip_description(self):
4563
chip_name = {
4664
0: "ESP32-C5 beta3 (QFN40)",

esptool/targets/esp32c6.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,10 @@ def get_secure_boot_enabled(self):
161161
)
162162

163163
def get_key_block_purpose(self, key_block):
164-
if key_block < 0 or key_block > 5:
165-
raise FatalError("Valid key block numbers must be in range 0-5")
164+
if key_block < 0 or key_block > self.EFUSE_MAX_KEY:
165+
raise FatalError(
166+
f"Valid key block numbers must be in range 0-{self.EFUSE_MAX_KEY}"
167+
)
166168

167169
reg, shift = [
168170
(self.EFUSE_PURPOSE_KEY0_REG, self.EFUSE_PURPOSE_KEY0_SHIFT),
@@ -176,7 +178,9 @@ def get_key_block_purpose(self, key_block):
176178

177179
def is_flash_encryption_key_valid(self):
178180
# Need to see an AES-128 key
179-
purposes = [self.get_key_block_purpose(b) for b in range(6)]
181+
purposes = [
182+
self.get_key_block_purpose(b) for b in range(self.EFUSE_MAX_KEY + 1)
183+
]
180184

181185
return any(p == self.PURPOSE_VAL_XTS_AES128_KEY for p in purposes)
182186

esptool/targets/esp32c61.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# SPDX-License-Identifier: GPL-2.0-or-later
44

55
import struct
6+
from typing import Dict
67

78
from .esp32c6 import ESP32C6ROM
89

@@ -60,6 +61,26 @@ class ESP32C61ROM(ESP32C6ROM):
6061

6162
UF2_FAMILY_ID = 0x77D850C4
6263

64+
EFUSE_MAX_KEY = 5
65+
KEY_PURPOSES: Dict[int, str] = {
66+
0: "USER/EMPTY",
67+
1: "ECDSA_KEY",
68+
2: "XTS_AES_256_KEY_1",
69+
3: "XTS_AES_256_KEY_2",
70+
4: "XTS_AES_128_KEY",
71+
5: "HMAC_DOWN_ALL",
72+
6: "HMAC_DOWN_JTAG",
73+
7: "HMAC_DOWN_DIGITAL_SIGNATURE",
74+
8: "HMAC_UP",
75+
9: "SECURE_BOOT_DIGEST0",
76+
10: "SECURE_BOOT_DIGEST1",
77+
11: "SECURE_BOOT_DIGEST2",
78+
12: "KM_INIT_KEY",
79+
13: "XTS_AES_256_KEY_1_PSRAM",
80+
14: "XTS_AES_256_KEY_2_PSRAM",
81+
15: "XTS_AES_128_KEY_PSRAM",
82+
}
83+
6384
def get_chip_description(self):
6485
chip_name = {
6586
0: "ESP32-C61",

esptool/targets/esp32h2.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#
44
# SPDX-License-Identifier: GPL-2.0-or-later
55

6+
from typing import Dict
7+
68
from .esp32c6 import ESP32C6ROM
79
from ..util import FatalError
810

@@ -32,6 +34,22 @@ class ESP32H2ROM(ESP32C6ROM):
3234

3335
UF2_FAMILY_ID = 0x332726F6
3436

37+
EFUSE_MAX_KEY = 5
38+
KEY_PURPOSES: Dict[int, str] = {
39+
0: "USER/EMPTY",
40+
1: "ECDSA_KEY",
41+
2: "XTS_AES_256_KEY_1",
42+
3: "XTS_AES_256_KEY_2",
43+
4: "XTS_AES_128_KEY",
44+
5: "HMAC_DOWN_ALL",
45+
6: "HMAC_DOWN_JTAG",
46+
7: "HMAC_DOWN_DIGITAL_SIGNATURE",
47+
8: "HMAC_UP",
48+
9: "SECURE_BOOT_DIGEST0",
49+
10: "SECURE_BOOT_DIGEST1",
50+
11: "SECURE_BOOT_DIGEST2",
51+
}
52+
3553
def get_pkg_version(self):
3654
num_word = 4
3755
return (self.read_reg(self.EFUSE_BLOCK1_ADDR + (4 * num_word)) >> 0) & 0x07

esptool/targets/esp32h2beta1.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# SPDX-License-Identifier: GPL-2.0-or-later
55

66
import struct
7+
from typing import Dict
78

89
from .esp32c3 import ESP32C3ROM
910
from ..util import FatalError, NotImplementedInROMError
@@ -77,6 +78,21 @@ class ESP32H2BETA1ROM(ESP32C3ROM):
7778
"12m": 0x2,
7879
}
7980

81+
EFUSE_MAX_KEY = 5
82+
KEY_PURPOSES: Dict[int, str] = {
83+
0: "USER/EMPTY",
84+
1: "ECDSA_KEY",
85+
2: "RESERVED",
86+
4: "XTS_AES_128_KEY",
87+
5: "HMAC_DOWN_ALL",
88+
6: "HMAC_DOWN_JTAG",
89+
7: "HMAC_DOWN_DIGITAL_SIGNATURE",
90+
8: "HMAC_UP",
91+
9: "SECURE_BOOT_DIGEST0",
92+
10: "SECURE_BOOT_DIGEST1",
93+
11: "SECURE_BOOT_DIGEST2",
94+
}
95+
8096
def get_pkg_version(self):
8197
num_word = 4
8298
return (self.read_reg(self.EFUSE_BLOCK1_ADDR + (4 * num_word)) >> 0) & 0x07
@@ -121,8 +137,10 @@ def get_flash_crypt_config(self):
121137
return None # doesn't exist on ESP32-H2
122138

123139
def get_key_block_purpose(self, key_block):
124-
if key_block < 0 or key_block > 5:
125-
raise FatalError("Valid key block numbers must be in range 0-5")
140+
if key_block < 0 or key_block > self.EFUSE_MAX_KEY:
141+
raise FatalError(
142+
f"Valid key block numbers must be in range 0-{self.EFUSE_MAX_KEY}"
143+
)
126144

127145
reg, shift = [
128146
(self.EFUSE_PURPOSE_KEY0_REG, self.EFUSE_PURPOSE_KEY0_SHIFT),
@@ -136,7 +154,9 @@ def get_key_block_purpose(self, key_block):
136154

137155
def is_flash_encryption_key_valid(self):
138156
# Need to see an AES-128 key
139-
purposes = [self.get_key_block_purpose(b) for b in range(6)]
157+
purposes = [
158+
self.get_key_block_purpose(b) for b in range(self.EFUSE_MAX_KEY + 1)
159+
]
140160

141161
return any(p == self.PURPOSE_VAL_XTS_AES128_KEY for p in purposes)
142162

0 commit comments

Comments
 (0)