CrackNuts 0.0.1.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cracknuts/__init__.py +5 -0
- cracknuts/__main__.py +33 -0
- cracknuts/acquisition/__init__.py +3 -0
- cracknuts/acquisition/acquisition.py +554 -0
- cracknuts/cracker/__init__.py +0 -0
- cracknuts/cracker/basic_cracker.py +334 -0
- cracknuts/cracker/cracker.py +548 -0
- cracknuts/cracker/mock_cracker.py +163 -0
- cracknuts/cracker/protocol.py +83 -0
- cracknuts/cracker/stateful_cracker.py +214 -0
- cracknuts/logger.py +88 -0
- cracknuts/solver/__init__.py +0 -0
- cracknuts/solver/trace.py +524 -0
- cracknuts/utils/__init__.py +0 -0
- cracknuts/utils/hex_util.py +38 -0
- cracknuts-0.0.1.dev2.dist-info/LICENSE +21 -0
- cracknuts-0.0.1.dev2.dist-info/METADATA +63 -0
- cracknuts-0.0.1.dev2.dist-info/RECORD +21 -0
- cracknuts-0.0.1.dev2.dist-info/WHEEL +5 -0
- cracknuts-0.0.1.dev2.dist-info/entry_points.txt +2 -0
- cracknuts-0.0.1.dev2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import struct
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from cracknuts.cracker import protocol
|
|
6
|
+
from cracknuts.cracker.cracker import AbsCnpCracker, Commands, Config
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class CrackerS1(AbsCnpCracker):
|
|
10
|
+
def __init__(self, *args, **kwargs) -> None:
|
|
11
|
+
super().__init__(*args, **kwargs)
|
|
12
|
+
self._default_config = Config(
|
|
13
|
+
nut_voltage=3500,
|
|
14
|
+
osc_analog_channel_enable={1: True, 2: False},
|
|
15
|
+
osc_sample_len=1024,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
def get_default_config(self) -> Config | None:
|
|
19
|
+
return self._default_config
|
|
20
|
+
|
|
21
|
+
def get_id(self) -> str | None:
|
|
22
|
+
_, res = self.send_and_receive(protocol.build_send_message(Commands.GET_ID))
|
|
23
|
+
return res.decode("ascii") if res is not None else None
|
|
24
|
+
|
|
25
|
+
def get_name(self) -> str | None:
|
|
26
|
+
_, res = self.send_and_receive(protocol.build_send_message(Commands.GET_NAME))
|
|
27
|
+
return res.decode("ascii") if res is not None else None
|
|
28
|
+
|
|
29
|
+
def get_version(self) -> str | None:
|
|
30
|
+
_, res = self.send_and_receive(protocol.build_send_message(Commands.GET_VERSION))
|
|
31
|
+
return res.decode("ascii") if res is not None else None
|
|
32
|
+
|
|
33
|
+
def osc_set_analog_channel_enable(self, enable: dict[int, bool]):
|
|
34
|
+
self._channel_enable = enable
|
|
35
|
+
payload = 0
|
|
36
|
+
if enable.get(0):
|
|
37
|
+
payload |= 1
|
|
38
|
+
if enable.get(1):
|
|
39
|
+
payload |= 1 << 1
|
|
40
|
+
if enable.get(2):
|
|
41
|
+
payload |= 1 << 2
|
|
42
|
+
if enable.get(3):
|
|
43
|
+
payload |= 1 << 3
|
|
44
|
+
if enable.get(4):
|
|
45
|
+
payload |= 1 << 4
|
|
46
|
+
if enable.get(5):
|
|
47
|
+
payload |= 1 << 5
|
|
48
|
+
if enable.get(6):
|
|
49
|
+
payload |= 1 << 6
|
|
50
|
+
if enable.get(7):
|
|
51
|
+
payload |= 1 << 7
|
|
52
|
+
if enable.get(8):
|
|
53
|
+
payload |= 1 << 8
|
|
54
|
+
payload = struct.pack(">I", payload)
|
|
55
|
+
self._logger.debug(f"Scrat analog_channel_enable payload: {payload.hex()}")
|
|
56
|
+
return self.send_with_command(Commands.OSC_ANALOG_CHANNEL_ENABLE, payload=payload)
|
|
57
|
+
|
|
58
|
+
def osc_set_analog_coupling(self, coupling: dict[int, int]):
|
|
59
|
+
payload = 0
|
|
60
|
+
if coupling.get(0):
|
|
61
|
+
payload |= 1
|
|
62
|
+
if coupling.get(1):
|
|
63
|
+
payload |= 1 << 1
|
|
64
|
+
if coupling.get(2):
|
|
65
|
+
payload |= 1 << 2
|
|
66
|
+
if coupling.get(3):
|
|
67
|
+
payload |= 1 << 3
|
|
68
|
+
if coupling.get(4):
|
|
69
|
+
payload |= 1 << 4
|
|
70
|
+
if coupling.get(5):
|
|
71
|
+
payload |= 1 << 5
|
|
72
|
+
if coupling.get(6):
|
|
73
|
+
payload |= 1 << 6
|
|
74
|
+
if coupling.get(7):
|
|
75
|
+
payload |= 1 << 7
|
|
76
|
+
if coupling.get(8):
|
|
77
|
+
payload |= 1 << 8
|
|
78
|
+
|
|
79
|
+
payload = struct.pack(">I", payload)
|
|
80
|
+
self._logger.debug(f"scrat_analog_coupling payload: {payload.hex()}")
|
|
81
|
+
|
|
82
|
+
return self.send_with_command(Commands.OSC_ANALOG_COUPLING, payload=payload)
|
|
83
|
+
|
|
84
|
+
def osc_set_analog_voltage(self, channel: int, voltage: int):
|
|
85
|
+
payload = struct.pack(">BI", channel, voltage)
|
|
86
|
+
self._logger.debug(f"scrat_analog_coupling payload: {payload.hex()}")
|
|
87
|
+
return self.send_with_command(Commands.OSC_ANALOG_VOLTAGE, payload=payload)
|
|
88
|
+
|
|
89
|
+
def osc_set_analog_bias_voltage(self, channel: int, voltage: int):
|
|
90
|
+
payload = struct.pack(">BI", channel, voltage)
|
|
91
|
+
self._logger.debug(f"scrat_analog_bias_voltage payload: {payload.hex()}")
|
|
92
|
+
return self.send_with_command(Commands.OSC_ANALOG_BIAS_VOLTAGE, payload=payload)
|
|
93
|
+
|
|
94
|
+
def osc_set_digital_channel_enable(self, enable: dict[int, bool]):
|
|
95
|
+
payload = 0
|
|
96
|
+
if enable.get(0):
|
|
97
|
+
payload |= 1
|
|
98
|
+
if enable.get(1):
|
|
99
|
+
payload |= 1 << 1
|
|
100
|
+
if enable.get(2):
|
|
101
|
+
payload |= 1 << 2
|
|
102
|
+
if enable.get(3):
|
|
103
|
+
payload |= 1 << 3
|
|
104
|
+
if enable.get(4):
|
|
105
|
+
payload |= 1 << 4
|
|
106
|
+
if enable.get(5):
|
|
107
|
+
payload |= 1 << 5
|
|
108
|
+
if enable.get(6):
|
|
109
|
+
payload |= 1 << 6
|
|
110
|
+
if enable.get(7):
|
|
111
|
+
payload |= 1 << 7
|
|
112
|
+
if enable.get(8):
|
|
113
|
+
payload |= 1 << 8
|
|
114
|
+
payload = struct.pack(">I", payload)
|
|
115
|
+
self._logger.debug(f"scrat_digital_channel_enable payload: {payload.hex()}")
|
|
116
|
+
return self.send_with_command(Commands.OSC_DIGITAL_CHANNEL_ENABLE, payload=payload)
|
|
117
|
+
|
|
118
|
+
def osc_set_digital_voltage(self, voltage: int):
|
|
119
|
+
payload = struct.pack(">I", voltage)
|
|
120
|
+
self._logger.debug(f"scrat_digital_voltage payload: {payload.hex()}")
|
|
121
|
+
return self.send_with_command(Commands.OSC_DIGITAL_VOLTAGE, payload=payload)
|
|
122
|
+
|
|
123
|
+
def osc_set_trigger_mode(self, source: int, stop: int):
|
|
124
|
+
payload = struct.pack(">II", source, stop)
|
|
125
|
+
self._logger.debug(f"scrat_trigger_mode payload: {payload.hex()}")
|
|
126
|
+
return self.send_with_command(Commands.OSC_TRIGGER_MODE, payload=payload)
|
|
127
|
+
|
|
128
|
+
def osc_set_analog_trigger_source(self, channel: int):
|
|
129
|
+
payload = struct.pack(">B", channel)
|
|
130
|
+
self._logger.debug(f"scrat_analog_trigger_source payload: {payload.hex()}")
|
|
131
|
+
return self.send_with_command(Commands.OSC_ANALOG_TRIGGER_SOURCE, payload=payload)
|
|
132
|
+
|
|
133
|
+
def osc_set_digital_trigger_source(self, channel: int):
|
|
134
|
+
payload = struct.pack(">B", channel)
|
|
135
|
+
self._logger.debug(f"scrat_digital_trigger_source payload: {payload.hex()}")
|
|
136
|
+
return self.send_with_command(Commands.OSC_DIGITAL_TRIGGER_SOURCE, payload=payload)
|
|
137
|
+
|
|
138
|
+
def osc_set_analog_trigger_voltage(self, voltage: int):
|
|
139
|
+
payload = struct.pack(">I", voltage)
|
|
140
|
+
self._logger.debug(f"scrat_analog_trigger_voltage payload: {payload.hex()}")
|
|
141
|
+
return self.send_with_command(Commands.OSC_ANALOG_TRIGGER_VOLTAGE, payload=payload)
|
|
142
|
+
|
|
143
|
+
def osc_set_sample_delay(self, delay: int):
|
|
144
|
+
payload = struct.pack(">i", delay)
|
|
145
|
+
self._logger.debug(f"osc_sample_delay payload: {payload.hex()}")
|
|
146
|
+
return self.send_with_command(Commands.OSC_SAMPLE_DELAY, payload=payload)
|
|
147
|
+
|
|
148
|
+
def osc_set_sample_len(self, length: int):
|
|
149
|
+
payload = struct.pack(">I", length)
|
|
150
|
+
self._logger.debug(f"osc_sample_len payload: {payload.hex()}")
|
|
151
|
+
return self.send_with_command(Commands.OSC_SAMPLE_LENGTH, payload=payload)
|
|
152
|
+
|
|
153
|
+
def osc_single(self):
|
|
154
|
+
payload = None
|
|
155
|
+
self._logger.debug("scrat_sample_len payload: %s", payload)
|
|
156
|
+
return self.send_with_command(Commands.OSC_SINGLE, payload=payload)
|
|
157
|
+
|
|
158
|
+
def osc_is_triggered(self):
|
|
159
|
+
payload = None
|
|
160
|
+
self._logger.debug("scrat_is_triggered payload: %s", payload=payload)
|
|
161
|
+
status, _ = self.send_with_command(Commands.OSC_IS_TRIGGERED, payload=payload)
|
|
162
|
+
return status
|
|
163
|
+
|
|
164
|
+
def osc_get_analog_wave(self, channel: int, offset: int, sample_count: int) -> tuple[int, np.ndarray]:
|
|
165
|
+
payload = struct.pack(">BII", channel, offset, sample_count)
|
|
166
|
+
self._logger.debug(f"scrat_get_analog_wave payload: {payload.hex()}")
|
|
167
|
+
status, wave_bytes = self.send_with_command(Commands.OSC_GET_ANALOG_WAVES, payload=payload)
|
|
168
|
+
self._logger.debug(f"scrat_get_analog_wave wave_bytes: {wave_bytes.hex()}")
|
|
169
|
+
if wave_bytes is None:
|
|
170
|
+
return status, np.array([[]])
|
|
171
|
+
else:
|
|
172
|
+
wave = struct.unpack(f"{sample_count}h", wave_bytes)
|
|
173
|
+
return status, np.array(wave, dtype=np.int32)
|
|
174
|
+
|
|
175
|
+
def osc_get_digital_wave(self, channel: int, offset: int, sample_count: int):
|
|
176
|
+
payload = struct.pack(">BII", channel, offset, sample_count)
|
|
177
|
+
self._logger.debug(f"scrat_get_digital_wave payload: {payload.hex()}")
|
|
178
|
+
status, wave_bytes = self.send_with_command(Commands.OSC_GET_ANALOG_WAVES, payload=payload)
|
|
179
|
+
wave = struct.unpack(f">{sample_count}I", wave_bytes)
|
|
180
|
+
return status, np.array(wave, dtype=np.int16)
|
|
181
|
+
|
|
182
|
+
def osc_set_analog_gain(self, channel: int, gain: int):
|
|
183
|
+
payload = struct.pack(">BB", channel, gain)
|
|
184
|
+
self._logger.debug(f"scrat_analog_gain payload: {payload.hex()}")
|
|
185
|
+
return self.send_with_command(Commands.OSC_ANALOG_GAIN, payload=payload)
|
|
186
|
+
|
|
187
|
+
def osc_set_analog_gain_raw(self, channel: int, gain: int):
|
|
188
|
+
payload = struct.pack(">BB", channel, gain)
|
|
189
|
+
self._logger.debug(f"scrat_analog_gain payload: {payload.hex()}")
|
|
190
|
+
return self.send_with_command(Commands.OSC_ANALOG_GAIN_RAW, payload=payload)
|
|
191
|
+
|
|
192
|
+
def nut_enable(self, enable: int):
|
|
193
|
+
payload = struct.pack(">B", enable)
|
|
194
|
+
self._logger.debug(f"cracker_nut_enable payload: {payload.hex()}")
|
|
195
|
+
return self.send_with_command(Commands.NUT_ENABLE, payload=payload)
|
|
196
|
+
|
|
197
|
+
def nut_voltage(self, voltage):
|
|
198
|
+
payload = struct.pack(">I", voltage)
|
|
199
|
+
self._logger.debug(f"cracker_nut_voltage payload: {payload.hex()}")
|
|
200
|
+
return self.send_with_command(Commands.NUT_VOLTAGE, payload=payload)
|
|
201
|
+
|
|
202
|
+
def nut_voltage_raw(self, voltage: int):
|
|
203
|
+
payload = struct.pack(">B", voltage)
|
|
204
|
+
self._logger.debug(f"cracker_nut_voltage payload: {payload.hex()}")
|
|
205
|
+
return self.send_with_command(Commands.NUT_VOLTAGE_RAW, payload=payload)
|
|
206
|
+
|
|
207
|
+
def nut_clock(self, clock: int):
|
|
208
|
+
payload = struct.pack(">I", clock)
|
|
209
|
+
self._logger.debug(f"cracker_nut_clock payload: {payload.hex()}")
|
|
210
|
+
return self.send_with_command(Commands.NUT_CLOCK, payload=payload)
|
|
211
|
+
|
|
212
|
+
def nut_interface(self, interface: dict[int, bool]):
|
|
213
|
+
payload = 0
|
|
214
|
+
if interface.get(0):
|
|
215
|
+
payload |= 1
|
|
216
|
+
if interface.get(1):
|
|
217
|
+
payload |= 1 << 1
|
|
218
|
+
if interface.get(2):
|
|
219
|
+
payload |= 1 << 2
|
|
220
|
+
if interface.get(3):
|
|
221
|
+
payload |= 1 << 3
|
|
222
|
+
|
|
223
|
+
payload = struct.pack(">I", payload)
|
|
224
|
+
self._logger.debug(f"cracker_nut_interface payload: {payload.hex()}")
|
|
225
|
+
return self.send_with_command(Commands.NUT_INTERFACE, payload=payload)
|
|
226
|
+
|
|
227
|
+
def nut_timeout(self, timeout: int):
|
|
228
|
+
payload = struct.pack(">I", timeout)
|
|
229
|
+
self._logger.debug(f"cracker_nut_timeout payload: {payload.hex()}")
|
|
230
|
+
return self.send_with_command(Commands.NUT_TIMEOUT, payload=payload)
|
|
231
|
+
|
|
232
|
+
def cracker_serial_baud(self, baud: int):
|
|
233
|
+
payload = struct.pack(">I", baud)
|
|
234
|
+
self._logger.debug(f"cracker_serial_baud payload: {payload.hex()}")
|
|
235
|
+
return self.send_with_command(Commands.CRACKER_SERIAL_BAUD, payload=payload)
|
|
236
|
+
|
|
237
|
+
def cracker_serial_width(self, width: int):
|
|
238
|
+
payload = struct.pack(">B", width)
|
|
239
|
+
self._logger.debug(f"cracker_serial_width payload: {payload.hex()}")
|
|
240
|
+
return self.send_with_command(Commands.CRACKER_SERIAL_WIDTH, payload=payload)
|
|
241
|
+
|
|
242
|
+
def cracker_serial_stop(self, stop: int):
|
|
243
|
+
payload = struct.pack(">B", stop)
|
|
244
|
+
self._logger.debug(f"cracker_serial_stop payload: {payload.hex()}")
|
|
245
|
+
return self.send_with_command(Commands.CRACKER_SERIAL_STOP, payload=payload)
|
|
246
|
+
|
|
247
|
+
def cracker_serial_odd_eve(self, odd_eve: int):
|
|
248
|
+
payload = struct.pack(">B", odd_eve)
|
|
249
|
+
self._logger.debug(f"cracker_serial_odd_eve payload: {payload.hex()}")
|
|
250
|
+
return self.send_with_command(Commands.CRACKER_SERIAL_ODD_EVE, payload=payload)
|
|
251
|
+
|
|
252
|
+
def cracker_serial_data(self, expect_len: int, data: bytes):
|
|
253
|
+
payload = struct.pack(">I", expect_len)
|
|
254
|
+
payload += data
|
|
255
|
+
self._logger.debug(f"cracker_serial_data payload: {payload.hex()}")
|
|
256
|
+
return self.send_with_command(Commands.CRACKER_SERIAL_DATA, payload=payload)
|
|
257
|
+
|
|
258
|
+
def cracker_spi_cpol(self, cpol: int):
|
|
259
|
+
payload = struct.pack(">B", cpol)
|
|
260
|
+
self._logger.debug(f"cracker_spi_cpol payload: {payload.hex()}")
|
|
261
|
+
return self.send_with_command(Commands.CRACKER_SPI_CPOL, payload=payload)
|
|
262
|
+
|
|
263
|
+
def cracker_spi_cpha(self, cpha: int):
|
|
264
|
+
payload = struct.pack(">B", cpha)
|
|
265
|
+
self._logger.debug(f"cracker_spi_cpha payload: {payload.hex()}")
|
|
266
|
+
return self.send_with_command(Commands.CRACKER_SPI_CPHA, payload=payload)
|
|
267
|
+
|
|
268
|
+
def cracker_spi_data_len(self, length: int):
|
|
269
|
+
payload = struct.pack(">B", length)
|
|
270
|
+
self._logger.debug(f"cracker_spi_data_len payload: {payload.hex()}")
|
|
271
|
+
return self.send_with_command(Commands.CRACKER_SPI_DATA_LEN, payload=payload)
|
|
272
|
+
|
|
273
|
+
def cracker_spi_freq(self, freq: int):
|
|
274
|
+
payload = struct.pack(">B", freq)
|
|
275
|
+
self._logger.debug(f"cracker_spi_freq payload: {payload.hex()}")
|
|
276
|
+
return self.send_with_command(Commands.CRACKER_SPI_FREQ, payload=payload)
|
|
277
|
+
|
|
278
|
+
def cracker_spi_timeout(self, timeout: int):
|
|
279
|
+
payload = struct.pack(">B", timeout)
|
|
280
|
+
self._logger.debug(f"cracker_spi_timeout payload: {payload.hex()}")
|
|
281
|
+
return self.send_with_command(Commands.CRACKER_SPI_TIMEOUT, payload=payload)
|
|
282
|
+
|
|
283
|
+
def cracker_spi_data(self, expect_len: int, data: bytes):
|
|
284
|
+
payload = struct.pack(">I", expect_len)
|
|
285
|
+
payload += data
|
|
286
|
+
self._logger.debug(f"cracker_spi_data payload: {payload.hex()}")
|
|
287
|
+
return self.send_with_command(Commands.CRACKER_SPI_DATA, payload=payload)
|
|
288
|
+
|
|
289
|
+
def cracker_i2c_freq(self, freq: int):
|
|
290
|
+
payload = struct.pack(">B", freq)
|
|
291
|
+
self._logger.debug(f"cracker_i2c_freq payload: {payload.hex()}")
|
|
292
|
+
return self.send_with_command(Commands.CRACKER_I2C_FREQ, payload=payload)
|
|
293
|
+
|
|
294
|
+
def cracker_i2c_timeout(self, timeout: int):
|
|
295
|
+
payload = struct.pack(">B", timeout)
|
|
296
|
+
self._logger.debug(f"cracker_i2c_timeout payload: {payload.hex()}")
|
|
297
|
+
return self.send_with_command(Commands.CRACKER_I2C_TIMEOUT, payload=payload)
|
|
298
|
+
|
|
299
|
+
def cracker_i2c_data(self, expect_len: int, data: bytes):
|
|
300
|
+
payload = struct.pack(">I", expect_len)
|
|
301
|
+
payload += data
|
|
302
|
+
self._logger.debug(f"cracker_i2c_data payload: {payload.hex()}")
|
|
303
|
+
return self.send_with_command(Commands.CRACKER_I2C_DATA, payload=payload)
|
|
304
|
+
|
|
305
|
+
def cracker_can_freq(self, freq: int):
|
|
306
|
+
payload = struct.pack(">B", freq)
|
|
307
|
+
self._logger.debug(f"cracker_can_freq payload: {payload.hex()}")
|
|
308
|
+
return self.send_with_command(Commands.CRACKER_CAN_FREQ, payload=payload)
|
|
309
|
+
|
|
310
|
+
def cracker_can_timeout(self, timeout: int):
|
|
311
|
+
payload = struct.pack(">B", timeout)
|
|
312
|
+
self._logger.debug(f"cracker_can_timeout payload: {payload.hex()}")
|
|
313
|
+
return self.send_with_command(Commands.CRACKER_CAN_TIMEOUT, payload=payload)
|
|
314
|
+
|
|
315
|
+
def cracker_can_data(self, expect_len: int, data: bytes):
|
|
316
|
+
payload = struct.pack(">I", expect_len)
|
|
317
|
+
payload += data
|
|
318
|
+
self._logger.debug(f"cracker_can_data payload: {payload.hex()}")
|
|
319
|
+
return self.send_with_command(Commands.CRACKER_CA_DATA, payload=payload)
|
|
320
|
+
|
|
321
|
+
def osc_force(self):
|
|
322
|
+
payload = None
|
|
323
|
+
self._logger.debug(f"scrat_force payload: {payload}")
|
|
324
|
+
return self.send_with_command(Commands.OSC_FORCE, payload=payload)
|
|
325
|
+
|
|
326
|
+
def osc_set_sample_clock(self, clock: int):
|
|
327
|
+
payload = struct.pack(">I", clock)
|
|
328
|
+
self._logger.debug(f"scrat_sample_clock payload: {payload.hex()}")
|
|
329
|
+
return self.send_with_command(Commands.OSC_SAMPLE_CLOCK, payload=payload)
|
|
330
|
+
|
|
331
|
+
def osc_set_sample_phase(self, phase: int):
|
|
332
|
+
payload = struct.pack(">I", phase)
|
|
333
|
+
self._logger.debug(f"scrat_sample_phase payload: {payload.hex()}")
|
|
334
|
+
return self.send_with_command(Commands.OSC_SAMPLE_PHASE, payload=payload)
|