Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions jupyter_frontend/src/components/Acquisition.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ const Acquisition: React.FC = () => {
size={"small"}
value={triggerJudgeWaitTime}
addonAfter={intl.formatMessage({id: "cracker.config.unit.second"})}
min={0.05}
step={0.01}
min={0.001}
step={0.001}
onChange={(v) => {
setTriggerJudgeWaitTime(Number(v));
}}
Expand Down
77 changes: 46 additions & 31 deletions src/cracknuts/acquisition/acquisition.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import numpy as np

from cracknuts import logger
from cracknuts.cracker.cracker_s1 import CrackerS1
from cracknuts.cracker.cracker_basic import CrackerBasic
from cracknuts.trace.trace import ZarrTraceDataset, NumpyTraceDataset

Expand All @@ -25,7 +24,8 @@ class AcquisitionConfig:
sample_length: int = 1024
sample_offset: int = 0
trigger_judge_timeout: float = 0.005
trigger_judge_wait_time: float = 0.001
trigger_judge_wait_time: float = 0.05
# trigger_judge_wait_time: float = 0.001
do_error_max_count: int = 1
file_path: str = ""
file_format: str = "zarr"
Expand Down Expand Up @@ -56,22 +56,22 @@ class Acquisition(abc.ABC):
MAX_WAVE_LENGTH = 32_000_000

def __init__(
self,
cracker: CrackerBasic,
trace_count: int = 1000,
sample_length: int = -1,
sample_offset: int = 0,
data_plaintext_length: int | None = None,
data_ciphertext_length: int | None = None,
data_key_length: int | None = None,
data_extended_length: int | None = None,
trigger_judge_wait_time: float = 0.01,
trigger_judge_timeout: float = 1.0,
do_error_handler_strategy: int = DO_ERROR_HANDLER_STRATEGY_EXIT,
do_error_max_count: int = -1,
file_format: str = "zarr",
file_path: str = "auto",
trace_fetch_interval: float = 0,
self,
cracker: CrackerBasic,
trace_count: int = 1000,
sample_length: int = -1,
sample_offset: int = 0,
data_plaintext_length: int | None = None,
data_ciphertext_length: int | None = None,
data_key_length: int | None = None,
data_extended_length: int | None = None,
trigger_judge_wait_time: float = 0.01,
trigger_judge_timeout: float = 1.0,
do_error_handler_strategy: int = DO_ERROR_HANDLER_STRATEGY_EXIT,
do_error_max_count: int = -1,
file_format: str = "zarr",
file_path: str = "auto",
trace_fetch_interval: float = 0,
):
"""
:param cracker: The controlled Cracker object.
Expand Down Expand Up @@ -846,7 +846,7 @@ def _is_triggered(self):
return triggered

def _get_waves(self, offset: int, sample_length: int) -> dict[int, np.ndarray]:
if sample_length == -1 or sample_length is None:
if sample_length == -1:
sample_length = self.cracker.get_current_config().osc_sample_length
config = self.cracker.get_current_config()

Expand All @@ -857,20 +857,35 @@ def _get_waves(self, offset: int, sample_length: int) -> dict[int, np.ndarray]:
enable_channels.append(1)
wave_dict = {}
for c in enable_channels:
_count = sample_length // self.MAX_WAVE_LENGTH
_left = sample_length % self.MAX_WAVE_LENGTH
_offset = offset
waves = []
for _ in range(_count):
_, _wave = self.cracker.osc_get_analog_wave(c, _offset, self.MAX_WAVE_LENGTH)
waves.append(_wave)
_offset += self.MAX_WAVE_LENGTH
if _left > 0:
_, _wave = self.cracker.osc_get_analog_wave(c, _offset, _left)
waves.append(_wave)
wave_dict[c] = np.concatenate(waves)
status, wave_dict[c] = self.cracker.osc_get_analog_wave(c, offset, sample_length)
return wave_dict

# def _get_waves(self, offset: int, sample_length: int) -> dict[int, np.ndarray]:
# if sample_length == -1 or sample_length is None:
# sample_length = self.cracker.get_current_config().osc_sample_length
# config = self.cracker.get_current_config()
#
# enable_channels = []
# if config.osc_channel_0_enable:
# enable_channels.append(0)
# if config.osc_channel_1_enable:
# enable_channels.append(1)
# wave_dict = {}
# for c in enable_channels:
# _count = sample_length // self.MAX_WAVE_LENGTH
# _left = sample_length % self.MAX_WAVE_LENGTH
# _offset = offset
# waves = []
# for _ in range(_count):
# _, _wave = self.cracker.osc_get_analog_wave(c, _offset, self.MAX_WAVE_LENGTH)
# waves.append(_wave)
# _offset += self.MAX_WAVE_LENGTH
# if _left > 0:
# _, _wave = self.cracker.osc_get_analog_wave(c, _offset, _left)
# waves.append(_wave)
# wave_dict[c] = np.concatenate(waves)
# return wave_dict

def _pre_finish(self): ...

def _post_finish(self): ...
Expand Down
5 changes: 3 additions & 2 deletions src/cracknuts/cracker/cracker_s1.py
Original file line number Diff line number Diff line change
Expand Up @@ -757,12 +757,12 @@ def _nut_set_clock_enable(self, enable: bool) -> tuple[int, None]:
return status, None

@connection_status_check
def nut_clock_freq(self, clock: int | str) -> tuple[int, None]:
def nut_clock_freq(self, clock: float | int | str) -> tuple[int, None]:
"""
Set nut clock.

:param clock: The clock of the nut in kHz
:type clock: int | str
:type clock: float | int | str
:return: The device response status
:rtype: tuple[int, None]
"""
Expand All @@ -781,6 +781,7 @@ def nut_clock_freq(self, clock: int | str) -> tuple[int, None]:
else:
self._logger.error(f"Unknown clock type: {clock}, 64M or 24M or 12M or 8M or 4M")
return protocol.STATUS_ERROR, None
clock = round(clock) # TODO 这里由于这些设置是在cracker中的server程序完成的,目前只支持这些整数值,后续优化
validate_nut_clock = (64000, 24000, 12000, 8000, 4000)
if clock not in validate_nut_clock:
self._logger.error(f"UnSupport osc clock, it should in {validate_nut_clock}")
Expand Down

This file was deleted.

This file was deleted.

Git LFS file not shown

This file was deleted.

16 changes: 8 additions & 8 deletions src/cracknuts/firmware/map.json
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
{
"cracker_s1_beta1": {
"server": "server-0.5.6-alpha.3.bin",
"bitstream": "bs-cracker_s1_v0.1-0.1.0-alpha.15.bit.bin"
"bitstream": "bs-cracker_s1_v0.1-0.1.0-alpha.14.bit.bin"
},
"cracker_s1_v0.1": {
"server": "server-0.5.6-alpha.3.bin",
"bitstream": "bs-cracker_s1_v0.1-0.1.0-alpha.15.bit.bin"
"bitstream": "bs-cracker_s1_v0.1-0.1.0-alpha.14.bit.bin"
},
"cracker_s1_v0.2": {
"server": "server-0.5.6-alpha.3.bin",
"bitstream": "bs-cracker_s1_v0.1-0.1.0-alpha.15.bit.bin"
"bitstream": "bs-cracker_s1_v0.1-0.1.0-alpha.14.bit.bin"
},
"cracker_s1_v1.0": {
"server": "server-0.5.6-alpha.3.bin",
"bitstream": "bs-cracker_s1_v0.1-0.1.0-alpha.15.bit.bin"
"bitstream": "bs-cracker_s1_v0.1-0.1.0-alpha.14.bit.bin"
},
"cracker_s1d_v1.0": {
"server": "server-sd-0.5.6-alpha.3.bin",
"bitstream": "bs-cracker_s1_v0.1-0.1.0-alpha.15.bit.bin"
"bitstream": "bs-cracker_s1_v0.1-0.1.0-alpha.14.bit.bin"
},
"cracker_g1_v1.0": {
"server": "server-0.5.6-alpha.3.bin",
"bitstream": "bs-cracker_g1_v0.1-0.0.0-alpha.6.bit.bin"
"bitstream": "bs-cracker_g1_v0.1-0.0.0-alpha.9.bit.bin"
},
"cracker_g1_v1.0": {
"cracker_g1d_v1_1": {
"server": "server-0.5.6-alpha.3.bin",
"bitstream": "bs-cracker_g1_v0.1-0.0.0-alpha.6.bit.bin"
"bitstream": "bs-cracker_g1_v0.1-0.0.0-alpha.9.bit.bin"
}
}
3 changes: 0 additions & 3 deletions src/cracknuts/firmware/server-0.5.6-alpha.2.bin

This file was deleted.

3 changes: 0 additions & 3 deletions src/cracknuts/firmware/server-sd-0.5.6-alpha.2.bin

This file was deleted.

144 changes: 144 additions & 0 deletions tests/jupyter/0.20/0.20_g1_startup.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "1cb5a996-2f83-417b-9efb-fdc4fb35d980",
"metadata": {},
"outputs": [],
"source": [
"import cracknuts as cn"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "ede7207d-0411-4fb2-aded-d1f4c5c82c4b",
"metadata": {},
"outputs": [],
"source": [
"g1 = cn.cracker_g1('192.168.0.10')\n",
"g1.connect(force_update_bin=True, force_write_default_config=True)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "442c29be-5fc3-4186-a704-e529e33b258d",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "43863abee97146958540d18613b869f7",
"version_major": 2,
"version_minor": 1
},
"text/plain": [
"WorkbenchG1Panel(acq_run_progress={'finished': 0, 'total': -1}, connect_status=True, custom_y_range={'0': (0, …"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import random\n",
"import time\n",
"from cracknuts.cracker import serial\n",
"\n",
"\n",
"cmd_set_aes_enc_key = \"01 00 00 00 00 00 00 10\"\n",
"cmd_aes_enc = \"01 02 00 00 00 00 00 10\"\n",
"\n",
"aes_key = \"11 22 33 44 55 66 77 88 99 00 aa bb cc dd ee ff\"\n",
"aes_data_len = 16\n",
"\n",
"sample_length = 20000\n",
"\n",
"def init(cracker):\n",
" cracker.nut_voltage_enable()\n",
" cracker.nut_voltage(3.3)\n",
" cracker.nut_clock_enable()\n",
" cracker.nut_clock_freq('8M')\n",
" cracker.uart_io_enable()\n",
" cracker.osc_sample_clock('48m')\n",
" cracker.osc_sample_length(sample_length)\n",
" cracker.osc_trigger_source('N')\n",
" cracker.osc_analog_gain('B', 10)\n",
" cracker.osc_trigger_level(0)\n",
" cracker.osc_trigger_mode('E')\n",
" cracker.osc_trigger_edge('U')\n",
" cracker.uart_config(baudrate=serial.Baudrate.BAUDRATE_115200, bytesize=serial.Bytesize.EIGHTBITS, parity=serial.Parity.PARITY_NONE, stopbits=serial.Stopbits.STOPBITS_ONE)\n",
"\n",
" time.sleep(2)\n",
" cmd = cmd_set_aes_enc_key + aes_key\n",
" status, ret = cracker.uart_transmit_receive(cmd, timeout=1000, rx_count=6)\n",
"\n",
"# def do(cracker, count):\n",
"# plaintext_data = random.randbytes(aes_data_len)\n",
"# tx_data = bytes.fromhex(cmd_aes_enc.replace(' ', '')) + plaintext_data\n",
"# status, ret = cracker.uart_transmit_receive(tx_data, rx_count= 6 + aes_data_len, is_trigger=True)\n",
" \n",
"# return {\n",
"# \"plaintext\": plaintext_data,\n",
"# \"ciphertext\": ret[-aes_data_len:],\n",
"# \"key\": bytes.fromhex(aes_key)\n",
"# }\n",
"\n",
"def do(cracker, count):\n",
" # plaintext_data = random.randbytes(aes_data_len)\n",
" plaintext_data = bytes.fromhex('AA BB CC DD EE FF 00 11 22 33 44 55 66 77 88 99')\n",
" tx_data = bytes.fromhex(cmd_aes_enc.replace(' ', '')) + plaintext_data\n",
" status, ret = cracker.uart_transmit_receive(tx_data, rx_count= 6 + aes_data_len, is_trigger=True)\n",
" # print(ret.hex(' ') if ret else 'None')\n",
" return {\n",
" \"plaintext\": plaintext_data,\n",
" \"ciphertext\": ret[-aes_data_len:],\n",
" \"key\": bytes.fromhex(aes_key)\n",
" }\n",
"\n",
"\n",
"def finish(cracker):\n",
" ...\n",
" # print('optional behavior')\n",
"\n",
"\n",
"acq = cn.simple_glitch_acq(g1, init, do)\n",
"\n",
"p = cn.show_panel(acq)\n",
"p"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a0562d3d-745d-4a3b-9b24-ab1b03ea18ff",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Loading