chipwhisperer-studio 0.5.1__tar.gz
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.
- chipwhisperer_studio-0.5.1/LICENSE +67 -0
- chipwhisperer_studio-0.5.1/MANIFEST.in +1 -0
- chipwhisperer_studio-0.5.1/NOTICE +14 -0
- chipwhisperer_studio-0.5.1/PKG-INFO +388 -0
- chipwhisperer_studio-0.5.1/README.md +327 -0
- chipwhisperer_studio-0.5.1/pyproject.toml +84 -0
- chipwhisperer_studio-0.5.1/setup.cfg +4 -0
- chipwhisperer_studio-0.5.1/src/chipwhisperer_studio.egg-info/PKG-INFO +388 -0
- chipwhisperer_studio-0.5.1/src/chipwhisperer_studio.egg-info/SOURCES.txt +118 -0
- chipwhisperer_studio-0.5.1/src/chipwhisperer_studio.egg-info/dependency_links.txt +1 -0
- chipwhisperer_studio-0.5.1/src/chipwhisperer_studio.egg-info/entry_points.txt +3 -0
- chipwhisperer_studio-0.5.1/src/chipwhisperer_studio.egg-info/requires.txt +25 -0
- chipwhisperer_studio-0.5.1/src/chipwhisperer_studio.egg-info/top_level.txt +1 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/__init__.py +10 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/__main__.py +6 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/aes.py +109 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/analysis.py +247 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/app.py +809 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/capabilities.py +314 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/capture.py +182 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/ccwrap.py +110 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/cli.py +355 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/codemap/__init__.py +1 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/codemap/avr.py +866 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/codemap/cycles.py +279 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/codemap/emu.py +929 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/codemap/power.py +247 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/codemap/program.py +677 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/codemap/service.py +627 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/codemap/sim.py +151 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/codemap/swo.py +165 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/codemap/timeline.py +293 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/compat.py +37 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/events.py +164 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/firmware.py +641 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/glitch.py +186 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/hardware.py +173 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/interfaces.py +969 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/logic/__init__.py +10 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/logic/decoders.py +1149 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/logic/formats.py +659 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/logic/model.py +465 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/logic/service.py +918 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/logic/sigrok.py +170 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/logic/sources.py +697 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/logic/synth.py +517 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/mcp_codemap.py +81 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/mcp_interfaces.py +140 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/mcp_logic.py +106 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/mcp_server.py +759 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/mcplite.py +594 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/mplbackend.py +15 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/net.py +60 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/notebook.py +1847 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/openocd.py +454 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/resources/50-newae.rules +20 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/resources/cw_openocd.cfg +14 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/resources/gtk_window.py +242 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/resources/icon.ico +0 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/resources/icon.png +0 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/resources/toolchains.json +299 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/session.py +549 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/settings.py +266 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/sim_interfaces.py +180 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/simtrigger.py +327 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/simulator.py +860 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/css/app.css +591 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/index.html +99 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/analysis.js +104 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/api.js +189 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/app.js +254 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/capture.js +95 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/codeband.js +276 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/codemap.js +500 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/connect.js +93 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/firmware.js +297 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/glitch.js +121 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/help.js +68 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/interfaces.js +589 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/logic.js +1071 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/markdown.js +238 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/notebook.js +783 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/settings.js +147 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/target.js +88 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/tools.js +250 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/js/waveform.js +435 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/vendor/LICENSE.uPlot +21 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/vendor/uPlot.iife.min.js +2 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/static/vendor/uPlot.min.css +1 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/toolchains.py +542 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/tools.py +176 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/traces.py +305 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/web.py +305 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/window.py +191 -0
- chipwhisperer_studio-0.5.1/src/cwstudio/worker.py +216 -0
- chipwhisperer_studio-0.5.1/tests/__init__.py +0 -0
- chipwhisperer_studio-0.5.1/tests/conftest.py +5 -0
- chipwhisperer_studio-0.5.1/tests/fwbuild.py +118 -0
- chipwhisperer_studio-0.5.1/tests/test_api.py +282 -0
- chipwhisperer_studio-0.5.1/tests/test_codemap.py +550 -0
- chipwhisperer_studio-0.5.1/tests/test_codemap_robust.py +288 -0
- chipwhisperer_studio-0.5.1/tests/test_interfaces.py +861 -0
- chipwhisperer_studio-0.5.1/tests/test_interfaces_hw.py +695 -0
- chipwhisperer_studio-0.5.1/tests/test_logic_decoders.py +410 -0
- chipwhisperer_studio-0.5.1/tests/test_logic_fixes.py +181 -0
- chipwhisperer_studio-0.5.1/tests/test_logic_perf.py +66 -0
- chipwhisperer_studio-0.5.1/tests/test_logic_realworld.py +506 -0
- chipwhisperer_studio-0.5.1/tests/test_logic_sources.py +562 -0
- chipwhisperer_studio-0.5.1/tests/test_mcp.py +248 -0
- chipwhisperer_studio-0.5.1/tests/test_net.py +55 -0
- chipwhisperer_studio-0.5.1/tests/test_notebook.py +617 -0
- chipwhisperer_studio-0.5.1/tests/test_sim_triggers.py +236 -0
- chipwhisperer_studio-0.5.1/tests/test_toolchains.py +161 -0
- chipwhisperer_studio-0.5.1/tests/test_ui_codemap.py +339 -0
- chipwhisperer_studio-0.5.1/tests/test_ui_integration.py +308 -0
- chipwhisperer_studio-0.5.1/tests/test_ui_interfaces.py +421 -0
- chipwhisperer_studio-0.5.1/tests/test_ui_logic.py +301 -0
- chipwhisperer_studio-0.5.1/tests/test_ui_notebooks.py +368 -0
- chipwhisperer_studio-0.5.1/tests/test_units.py +298 -0
- chipwhisperer_studio-0.5.1/tests/test_window.py +304 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
|
|
10
|
+
|
|
11
|
+
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
|
|
12
|
+
|
|
13
|
+
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
|
|
14
|
+
|
|
15
|
+
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
|
|
16
|
+
|
|
17
|
+
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
|
|
18
|
+
|
|
19
|
+
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
|
|
20
|
+
|
|
21
|
+
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
|
|
22
|
+
|
|
23
|
+
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
|
|
24
|
+
|
|
25
|
+
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
|
|
26
|
+
|
|
27
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
|
|
28
|
+
|
|
29
|
+
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
|
|
30
|
+
|
|
31
|
+
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
|
|
32
|
+
|
|
33
|
+
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
|
|
34
|
+
|
|
35
|
+
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
|
|
36
|
+
|
|
37
|
+
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
|
|
38
|
+
|
|
39
|
+
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
|
|
40
|
+
|
|
41
|
+
(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
|
|
42
|
+
|
|
43
|
+
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
|
|
44
|
+
|
|
45
|
+
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
|
|
46
|
+
|
|
47
|
+
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
|
|
48
|
+
|
|
49
|
+
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
|
|
50
|
+
|
|
51
|
+
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
|
|
52
|
+
|
|
53
|
+
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
|
|
54
|
+
|
|
55
|
+
END OF TERMS AND CONDITIONS
|
|
56
|
+
|
|
57
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
58
|
+
|
|
59
|
+
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
|
|
60
|
+
|
|
61
|
+
Copyright [yyyy] [name of copyright owner]
|
|
62
|
+
|
|
63
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
|
|
64
|
+
|
|
65
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
66
|
+
|
|
67
|
+
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
recursive-include tests *.py
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
ChipWhisperer Studio
|
|
2
|
+
|
|
3
|
+
Copyright 2026 Keyur Aghao
|
|
4
|
+
|
|
5
|
+
This product is an independent project and is not affiliated with or endorsed by NewAE Technology Inc. "ChipWhisperer" is a trademark of NewAE Technology Inc.
|
|
6
|
+
|
|
7
|
+
It uses the ChipWhisperer Python library (https://github.com/newaetech/chipwhisperer, Apache License 2.0) and includes the following third-party files:
|
|
8
|
+
|
|
9
|
+
- src/cwstudio/resources/50-newae.rules: udev rules from the ChipWhisperer project, Copyright NewAE Technology Inc., Apache License 2.0.
|
|
10
|
+
- src/cwstudio/static/vendor/uPlot*: uPlot by Leon Sorokin, MIT License (see LICENSE.uPlot).
|
|
11
|
+
|
|
12
|
+
The standalone bundles also contain Python, the chipwhisperer library, matplotlib, numpy and the other packages Studio depends on, each under its own licence.
|
|
13
|
+
|
|
14
|
+
Compiler toolchains are not included. When a user asks for one, Studio downloads the official upstream release (xPack GNU Arm and RISC-V GCC, Arduino's AVR GCC build, LLVM clang from the Zig toolchain, xPack Windows build tools), each under its own licence.
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: chipwhisperer-studio
|
|
3
|
+
Version: 0.5.1
|
|
4
|
+
Summary: Desktop app for ChipWhisperer hardware: live waveforms, capture, CPA, glitch sweeps, UART/SPI/JTAG/SWD interfaces, a logic analyser, firmware code on the power trace, notebooks, firmware builds and an MCP server
|
|
5
|
+
Author: Keyur Aghao
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/keyuraghao/chipwhisperer-studio
|
|
8
|
+
Project-URL: Documentation, https://github.com/keyuraghao/chipwhisperer-studio/wiki
|
|
9
|
+
Project-URL: Repository, https://github.com/keyuraghao/chipwhisperer-studio
|
|
10
|
+
Project-URL: Issues, https://github.com/keyuraghao/chipwhisperer-studio/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/keyuraghao/chipwhisperer-studio/blob/main/CHANGELOG.md
|
|
12
|
+
Project-URL: Video tour, https://github.com/keyuraghao/chipwhisperer-studio/wiki/Video-Tour
|
|
13
|
+
Keywords: chipwhisperer,side-channel,power-analysis,fault-injection,glitching,cpa,hardware-security,logic-analyzer,protocol-decoder,jtag,swd,oscilloscope,embedded,firmware,mcp
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Environment :: Web Environment
|
|
16
|
+
Classifier: Environment :: X11 Applications :: GTK
|
|
17
|
+
Classifier: Environment :: MacOS X :: Cocoa
|
|
18
|
+
Classifier: Environment :: Win32 (MS Windows)
|
|
19
|
+
Classifier: Framework :: Jupyter
|
|
20
|
+
Classifier: Intended Audience :: Education
|
|
21
|
+
Classifier: Intended Audience :: Science/Research
|
|
22
|
+
Classifier: Intended Audience :: Developers
|
|
23
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
24
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
25
|
+
Classifier: Operating System :: MacOS
|
|
26
|
+
Classifier: Programming Language :: Python :: 3
|
|
27
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
28
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
29
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
30
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
31
|
+
Classifier: Topic :: Security
|
|
32
|
+
Classifier: Topic :: Security :: Cryptography
|
|
33
|
+
Classifier: Topic :: Scientific/Engineering
|
|
34
|
+
Classifier: Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
|
|
35
|
+
Classifier: Topic :: System :: Hardware
|
|
36
|
+
Requires-Python: >=3.10
|
|
37
|
+
Description-Content-Type: text/markdown
|
|
38
|
+
License-File: LICENSE
|
|
39
|
+
License-File: NOTICE
|
|
40
|
+
Requires-Dist: chipwhisperer>=6.0
|
|
41
|
+
Requires-Dist: numpy>=1.24
|
|
42
|
+
Requires-Dist: starlette>=0.37
|
|
43
|
+
Requires-Dist: uvicorn>=0.27
|
|
44
|
+
Requires-Dist: websockets>=12
|
|
45
|
+
Requires-Dist: truststore>=0.9
|
|
46
|
+
Requires-Dist: certifi
|
|
47
|
+
Requires-Dist: matplotlib>=3.7
|
|
48
|
+
Requires-Dist: tqdm
|
|
49
|
+
Requires-Dist: pyelftools>=0.30
|
|
50
|
+
Requires-Dist: unicorn>=2.0.1
|
|
51
|
+
Requires-Dist: pywebview>=5; sys_platform == "win32" or sys_platform == "darwin"
|
|
52
|
+
Provides-Extra: window
|
|
53
|
+
Provides-Extra: test
|
|
54
|
+
Requires-Dist: pytest; extra == "test"
|
|
55
|
+
Requires-Dist: httpx; extra == "test"
|
|
56
|
+
Provides-Extra: test-mcp
|
|
57
|
+
Requires-Dist: pytest; extra == "test-mcp"
|
|
58
|
+
Requires-Dist: httpx; extra == "test-mcp"
|
|
59
|
+
Requires-Dist: mcp>=2.2; extra == "test-mcp"
|
|
60
|
+
Dynamic: license-file
|
|
61
|
+
|
|
62
|
+
<p align="center"><img src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/logo.png" alt="ChipWhisperer Studio" width="120"></p>
|
|
63
|
+
|
|
64
|
+
# ChipWhisperer Studio
|
|
65
|
+
|
|
66
|
+
A desktop application for [NewAE ChipWhisperer](https://github.com/newaetech/chipwhisperer) side-channel and fault-injection hardware. Connect a scope, build and flash target firmware, capture power traces while the waveform updates live, recover AES keys with CPA and sweep glitch parameters without writing Python or setting up Jupyter. Talk to the target over UART, SPI, GPIO and JTAG/SWD, capture and decode logic signals, and see which line of firmware runs at each point of a trace. When you do want code, built-in notebooks run Python cell by cell against the same hardware, including NewAE's own tutorial notebooks. An MCP server lets AI agents drive all of it.
|
|
67
|
+
|
|
68
|
+
[](https://github.com/keyuraghao/chipwhisperer-studio/actions/workflows/ci.yml)  
|
|
69
|
+
|
|
70
|
+
**Documentation:** the [ChipWhisperer Studio wiki](https://github.com/keyuraghao/chipwhisperer-studio/wiki) explains every feature, option and setup step in detail, from [installation](https://github.com/keyuraghao/chipwhisperer-studio/wiki/Installation) and a [quick start](https://github.com/keyuraghao/chipwhisperer-studio/wiki/Quick-Start) to the [MCP server](https://github.com/keyuraghao/chipwhisperer-studio/wiki/MCP-Server) and [troubleshooting](https://github.com/keyuraghao/chipwhisperer-studio/wiki/Troubleshooting).
|
|
71
|
+
|
|
72
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/capture-light.png"><img alt="ChipWhisperer Studio capturing traces with a live waveform" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/capture.png"></picture>
|
|
73
|
+
|
|
74
|
+
**See it in action:** every section below has a short clip that plays by itself. There is also a full [video walkthrough of every feature](https://github.com/keyuraghao/chipwhisperer-studio/releases/download/v0.5.0/chipwhisperer-studio-demo.mp4) (a few minutes, made with the built-in simulator), with chapters listed on the [Video Tour](https://github.com/keyuraghao/chipwhisperer-studio/wiki/Video-Tour) wiki page. Screenshots on this page follow your GitHub theme.
|
|
75
|
+
|
|
76
|
+
[](https://github.com/keyuraghao/chipwhisperer-studio/releases/download/v0.5.0/chipwhisperer-studio-demo.mp4)
|
|
77
|
+
|
|
78
|
+
> ChipWhisperer Studio is an independent community project. It is not affiliated with or endorsed by NewAE Technology Inc.; it uses their open source `chipwhisperer` Python library for all hardware access.
|
|
79
|
+
|
|
80
|
+
## Contents
|
|
81
|
+
|
|
82
|
+
- [Video tour](#chipwhisperer-studio)
|
|
83
|
+
- [Features](#features)
|
|
84
|
+
- [Install](#install)
|
|
85
|
+
- [Walkthrough](#walkthrough): [connect](#1-connect), [scope](#2-configure-the-scope), [target](#3-program-and-talk-to-the-target), [interfaces](#4-use-the-targets-interfaces), [capture](#5-capture-traces), [CPA](#6-recover-the-key-with-cpa), [glitching](#7-sweep-glitch-parameters), [code on the waveform](#8-see-the-code-on-the-waveform), [notebooks](#9-work-in-notebooks), [logic analyser](#10-capture-and-decode-logic-signals), [notes](#11-take-notes-and-do-the-maths)
|
|
86
|
+
- [Building firmware](#building-firmware)
|
|
87
|
+
- [AI agents (MCP)](#ai-agents-mcp)
|
|
88
|
+
- [HTTP API and remote use](#http-api-and-remote-use)
|
|
89
|
+
- [Performance](#performance)
|
|
90
|
+
- [Architecture](#architecture)
|
|
91
|
+
- [Development](#development)
|
|
92
|
+
- [Releases](#releases)
|
|
93
|
+
- [License](#license)
|
|
94
|
+
- [Full documentation (wiki)](https://github.com/keyuraghao/chipwhisperer-studio/wiki)
|
|
95
|
+
|
|
96
|
+
## Features
|
|
97
|
+
|
|
98
|
+
| Area | What you get |
|
|
99
|
+
|------|--------------|
|
|
100
|
+
| Connect | Auto-detect ChipWhisperer Nano, Lite, Pro, Husky and Husky Plus, pick a device by serial number, and follow platform-specific driver and udev help. A built-in **simulator** lets you try everything without hardware, posing as any of these models and even running your own firmware in an emulator. |
|
|
101
|
+
| Scope | Every setting of the connected scope (gain, ADC, clock, trigger, IO, glitch, Husky extras) as an editable tree with inline documentation and hardware read-back after each change. |
|
|
102
|
+
| Target | Program STM32F, XMEGA, AVR, SAM4S and NEORV32 targets and iCE40 and XC7A35T FPGAs, use a serial terminal (text or hex), send SimpleSerial commands, and edit target interface settings. |
|
|
103
|
+
| Interfaces | UART with a terminal, SimpleSerial 1.0 to 2.1, an SPI master with flash shortcuts, GPIO, the Husky's USERIO header, every trigger type (Husky sequencer, UART pattern, edge counter, ADC level, SAD, Pro I/O decode), the bit-banger and 1-Wire, and JTAG/SWD through OpenOCD. Only what the connected model supports is enabled, the rest says why. |
|
|
104
|
+
| Firmware | Build any ChipWhisperer firmware project for any platform with **GCC or clang**. Compilers download on demand and sources come straight from NewAE's GitHub. |
|
|
105
|
+
| Waveform | Live view of every capture, an overlay of the last N traces, mean and min/max envelope, trace browsing, zoom (drag, buttons or +/- keys), two cursors with delta read-out, a time axis and PNG export. |
|
|
106
|
+
| Code | **Code on the waveform**: Studio emulates your firmware (Arm Cortex-M, RISC-V, AVR/XMEGA) for a captured trace, aligns it automatically and shows functions and source lines under the plot; select part of the trace to see the code that made it. |
|
|
107
|
+
| Capture | Single, N traces or continuous; fixed, random or counter keys and plaintexts; trigger-only mode; rate limiting; export to `.npz`, `.cwp` (ChipWhisperer project) or `.csv`. |
|
|
108
|
+
| Analysis | Progressive CPA with five AES leakage models, per-byte ranking, PGE convergence and correlation plots. |
|
|
109
|
+
| Glitch | Cartesian or random sweeps over any `glitch.*` parameters with target reset handling and a live result scatter plot. |
|
|
110
|
+
| Notebook | Jupyter-style `.ipynb` notebooks that run inside Studio and share its hardware connection, as tabs or two side by side, each with its own kernel; captured traces land in the Capture tab. Runs NewAE's tutorial notebooks unmodified. |
|
|
111
|
+
| Logic | A logic analyser for every model: the Husky's built-in one, any scope's analog input, sigrok analysers, VCD/CSV/sigrok files or simulated traffic, with UART, SPI, I2C, 1-Wire, JTAG, SWD, CAN and SimpleSerial decoders, search, cursors, measurements and exports. |
|
|
112
|
+
| Notes and Calc | A text pad, a calculator with side-channel helpers (`hw`, `hd`, `sbox`, XOR), and live statistics of whatever you select. |
|
|
113
|
+
| AI agents | `cw-studio mcp`: a Model Context Protocol server with 106 tools covering all of the above. |
|
|
114
|
+
| Everywhere | Its own application window (or your browser), light and dark themes, a documented HTTP API (`/api/docs`), and remote use from any browser on the network. |
|
|
115
|
+
|
|
116
|
+
## Install
|
|
117
|
+
|
|
118
|
+
### Standalone bundle (no Python needed)
|
|
119
|
+
|
|
120
|
+
Every [release](https://github.com/keyuraghao/chipwhisperer-studio/releases/latest) has two builds per platform (about 72 MB each): **ChipWhisperer Studio** (`ChipWhispererStudio-<os>-<arch>.zip`) opens in its own application window, and **ChipWhisperer Studio Web** (`ChipWhispererStudio-Web-<os>-<arch>.zip`) opens in your web browser. Unzip one and run:
|
|
121
|
+
|
|
122
|
+
- **Windows:** `ChipWhispererStudio.exe`. If the device is not detected, install the NewAE WinUSB driver.
|
|
123
|
+
- **macOS:** `ChipWhisperer Studio.app` or `ChipWhisperer Studio Web.app` (right-click and choose Open the first time).
|
|
124
|
+
- **Linux:** `./chipwhisperer-studio.sh`. Install the udev rule once; the Connect tab shows the exact command. `./ChipWhispererStudio --install-desktop` adds Studio with its icon to the applications menu.
|
|
125
|
+
|
|
126
|
+
The window uses the system's web engine (Edge WebView2 on Windows, WebKit on macOS, WebKitGTK on Linux, where `sudo apt install python3-gi gir1.2-webkit2-4.1` may be needed once; without it Studio opens in the browser). Details are on the [Installation](https://github.com/keyuraghao/chipwhisperer-studio/wiki/Installation) wiki page.
|
|
127
|
+
|
|
128
|
+
### With Python
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
pip install chipwhisperer-studio
|
|
132
|
+
cw-studio # opens Studio in its own window
|
|
133
|
+
cw-studio-web # or in your web browser
|
|
134
|
+
cw-studio --simulate # try it without hardware
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Studio is on [PyPI](https://pypi.org/project/chipwhisperer-studio/); the wheel is also attached to every [release](https://github.com/keyuraghao/chipwhisperer-studio/releases). Use Python 3.10 to 3.12: `chipwhisperer` 6.0.0 on PyPI pins numpy 1.26, which has no wheels for newer Pythons.
|
|
138
|
+
|
|
139
|
+
Options: `--simulate` (pre-select the simulator), `--port 8765`, `--host 0.0.0.0` (remote access), `--browser` (use the web browser), `--app-window` (use Studio's window even with `cw-studio-web`), `--no-browser` (server only), `--data-dir DIR` (exports, firmware, toolchains, notebooks and notes; default `~/ChipWhispererStudio`), `--log-level debug|info|warning|error`.
|
|
140
|
+
|
|
141
|
+
## Walkthrough
|
|
142
|
+
|
|
143
|
+
### 1. Connect
|
|
144
|
+
|
|
145
|
+
Choose your ChipWhisperer (or Auto-detect, or the Simulator and the model it should pose as) and press **Connect scope**, then **Connect target**. Use SimpleSerial v2 for current ChipWhisperer firmware.
|
|
146
|
+
|
|
147
|
+

|
|
148
|
+
|
|
149
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/connect-light.png"><img alt="Connect tab" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/connect.png"></picture>
|
|
150
|
+
|
|
151
|
+
### 2. Configure the scope
|
|
152
|
+
|
|
153
|
+
Every scope setting is listed with its documentation (hover a name) and read back from the hardware after each change. Press **Single** in the header to check the waveform while you adjust gain, samples, offset and trigger.
|
|
154
|
+
|
|
155
|
+

|
|
156
|
+
|
|
157
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/scope-light.png"><img alt="Scope settings tree" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/scope.png"></picture>
|
|
158
|
+
|
|
159
|
+
### 3. Program and talk to the target
|
|
160
|
+
|
|
161
|
+
Program a `.hex` from disk or straight from a Studio build, check the target answers in the serial console, and send SimpleSerial commands by hand.
|
|
162
|
+
|
|
163
|
+

|
|
164
|
+
|
|
165
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/target-light.png"><img alt="Target tab" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/target.png"></picture>
|
|
166
|
+
|
|
167
|
+
### 4. Use the target's interfaces
|
|
168
|
+
|
|
169
|
+
The **Interfaces** tab has a UART terminal, SimpleSerial, an SPI master (read a flash chip's JEDEC ID with one click), GPIO, the Husky's USERIO pins, every trigger type the scope offers, the Husky bit-banger with 1-Wire, and JTAG/SWD debugging and flashing through OpenOCD (installed on demand). Everything the connected model cannot do stays visible with the reason, and the [capability matrix](https://github.com/keyuraghao/chipwhisperer-studio/wiki/Protocols-and-Interfaces) lists it per model.
|
|
170
|
+
|
|
171
|
+

|
|
172
|
+
|
|
173
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/interfaces-light.png"><img alt="Interfaces tab for a simulated Husky" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/interfaces.png"></picture>
|
|
174
|
+
|
|
175
|
+
### 5. Capture traces
|
|
176
|
+
|
|
177
|
+
Pick a trace count and key/plaintext mode and press **Run**. Traces stream to the waveform view as they are captured. Overlay the last N traces, show the mean and min/max envelope, zoom, and place cursors. Export as a ChipWhisperer project (`.cwp`) or `.npz` to continue in Python.
|
|
178
|
+
|
|
179
|
+

|
|
180
|
+
|
|
181
|
+

|
|
182
|
+
|
|
183
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/capture-light.png"><img alt="Capture with the live trace and the running mean" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/capture.png"></picture>
|
|
184
|
+
|
|
185
|
+
Zoom with the magnifier buttons next to **Fit** (or the **+** and **-** keys): each step halves or doubles the visible range around cursor A. Dragging across the plot zooms into a range, and **Fit** or a double-click shows the whole trace again.
|
|
186
|
+
|
|
187
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/waveform-zoom-light.png"><img alt="Waveform zoomed in around cursor A with the time axis" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/waveform-zoom.png"></picture>
|
|
188
|
+
|
|
189
|
+

|
|
190
|
+
|
|
191
|
+
### 6. Recover the key with CPA
|
|
192
|
+
|
|
193
|
+
Run a correlation power analysis attack with the leakage model that matches your target. With a known key the partial guessing entropy (PGE) plot shows every byte converging to rank 0; click a byte to see where it leaks in the trace.
|
|
194
|
+
|
|
195
|
+

|
|
196
|
+
|
|
197
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/analysis-light.png"><img alt="CPA result with all 16 key bytes recovered" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/analysis.png"></picture>
|
|
198
|
+
|
|
199
|
+
### 7. Sweep glitch parameters
|
|
200
|
+
|
|
201
|
+
Configure the glitch module in the Scope tab, then sweep parameters such as `glitch.ext_offset` and `glitch.width`. Each point is classified as normal, success (a valid but wrong answer) or reset, and plotted live.
|
|
202
|
+
|
|
203
|
+

|
|
204
|
+
|
|
205
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/glitch-light.png"><img alt="Glitch sweep scatter plot" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/glitch.png"></picture>
|
|
206
|
+
|
|
207
|
+
### 8. See the code on the waveform
|
|
208
|
+
|
|
209
|
+
Give Studio the firmware's ELF (it uses the one you built or programmed automatically) and the **Code** tab emulates it for the inputs of a captured trace: Unicorn for Arm Cortex-M and RISC-V, Studio's own cycle-accurate emulator for AVR and XMEGA. It maps clock cycles to samples, aligns the result with the measured traces (with a confidence score) and draws the functions and source lines in a band under the waveform. Ctrl+drag across the trace to see the code, source lines and disassembly of that region; click a line to shade every sample where it ran. Peripherals and interrupts are not emulated, so timing is close rather than exact; on a Husky, SWO program counter sampling measures it. Programmed into the simulator, the same ELF runs for real: CPA works on its traces and a glitch skips instructions.
|
|
210
|
+
|
|
211
|
+

|
|
212
|
+
|
|
213
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/code-light.png"><img alt="Code band under the waveform with a selected region and its source lines" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/code.png"></picture>
|
|
214
|
+
|
|
215
|
+
### 9. Work in notebooks
|
|
216
|
+
|
|
217
|
+
The **Notebook** tab is a Jupyter-style editor that runs inside Studio. Write Python cell by cell (Shift+Enter runs a cell), mix in Markdown text cells, and see output, errors and matplotlib figures inline. Cells share Studio's hardware connection: `cw.scope()` and `cw.target()` return the devices you connected, and every trace captured with `cw.capture_trace()` or a manual `scope.arm()` / `scope.capture()` loop shows up live in the waveform view. Press **View traces** to jump to the Capture tab with them.
|
|
218
|
+
|
|
219
|
+

|
|
220
|
+
|
|
221
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/notebook-light.png"><img alt="Notebook running a capture and plotting the mean trace" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/notebook.png"></picture>
|
|
222
|
+
|
|
223
|
+
Open several notebooks as tabs, or drag one to the side to see two at once. Each notebook has its own kernel (its own variables), and cells of all notebooks take turns on the hardware. Notebooks open in several windows, or changed by an agent, stay in sync.
|
|
224
|
+
|
|
225
|
+

|
|
226
|
+
|
|
227
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/notebook-split-light.png"><img alt="Two notebooks side by side" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/notebook-split.png"></picture>
|
|
228
|
+
|
|
229
|
+
Notebooks are standard `.ipynb` files: import your own, or export them to use with Jupyter. **Download tutorials** fetches NewAE's chipwhisperer-jupyter courses (SCA101, Fault101 and more) at the version that matches your firmware sources. They run unmodified: `%run` setup scripts, `%%bash` build cells using Studio's compilers, programming and capture loops all work. The `studio` object adds shortcuts such as `studio.traces`, `studio.build_firmware()` and `studio.program()`.
|
|
230
|
+
|
|
231
|
+
### 10. Capture and decode logic signals
|
|
232
|
+
|
|
233
|
+
The **Logic** tab is a logic analyser for every ChipWhisperer: the Husky's built-in one (9 signals, up to 65,535 samples on the Husky Plus), one line through any scope's analog input, external analysers through sigrok, PulseView, Saleae and VCD files, or simulated traffic. Decoders for UART, SPI, I2C, 1-Wire (with overdrive), JTAG, SWD, CAN and SimpleSerial run on any capture, with a glitch filter, buses, edge, pattern and value search, cursors, measurements, a results table and exports to VCD, CSV and sigrok. Big captures decode in a background process and the view stays fast at millions of samples.
|
|
234
|
+
|
|
235
|
+

|
|
236
|
+
|
|
237
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/logic-light.png"><img alt="Logic tab with decoded UART, SPI and I2C" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/logic.png"></picture>
|
|
238
|
+
|
|
239
|
+
### 11. Take notes and do the maths
|
|
240
|
+
|
|
241
|
+
**Notes** is a text pad for keys, glitch settings that worked and to-dos, saved automatically as Markdown files. **Calc** evaluates expressions with side-channel helpers (`0x2b ^ 0x7e`, `hw(x)`, `hd(a, b)`, `sbox(x)`, `mean(...)`) and computes count, sum, mean, median, min, max, peak to peak, standard deviation and RMS of the current selection: the waveform between cursors or in the zoomed range, one sample across all traces, or any selected text.
|
|
242
|
+
|
|
243
|
+

|
|
244
|
+
|
|
245
|
+

|
|
246
|
+
|
|
247
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/notes-light.png"><img alt="Notes tab with the Markdown preview of a lab note" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/notes.png"></picture>
|
|
248
|
+
|
|
249
|
+
Select numbers anywhere in Studio (a note, notebook output, the log or the serial console) and the log bar shows their count, sum, mean, min and max immediately.
|
|
250
|
+
|
|
251
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/calc-light.png"><img alt="Calculator with statistics between the waveform cursors" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/calc.png"></picture>
|
|
252
|
+
|
|
253
|
+
## Building firmware
|
|
254
|
+
|
|
255
|
+
The **Firmware** tab builds ChipWhisperer's own firmware projects (simpleserial-aes, simpleserial-glitch, simpleserial-ecc and the others) with ChipWhisperer's makefiles, for any of the 38 platforms they support. Choose a project, a platform and GCC or clang, then press **Build & program**: Studio compiles the firmware and flashes the connected target with the right programmer.
|
|
256
|
+
|
|
257
|
+

|
|
258
|
+
|
|
259
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/firmware-light.png"><img alt="Firmware tab after a clang build for CW-Lite Arm" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/firmware.png"></picture>
|
|
260
|
+
|
|
261
|
+

|
|
262
|
+
|
|
263
|
+
### Compilers download on demand
|
|
264
|
+
|
|
265
|
+
Studio does not bundle compilers, which would add hundreds of MB to every download. The first time a build needs one, Studio downloads the official release for your OS, checks it against a pinned SHA-256 checksum, unpacks it into the data folder and uses it offline from then on.
|
|
266
|
+
|
|
267
|
+
| Toolchain | Version | Targets | Source |
|
|
268
|
+
|-----------|---------|---------|--------|
|
|
269
|
+
| GNU Arm GCC | 15.2.1 | Arm Cortex-M (CW-Lite Arm, Nano, Husky, STM32, SAM4S, K82F, ...) | [xPack](https://xpack-dev-tools.github.io/arm-none-eabi-gcc-xpack/) |
|
|
270
|
+
| GNU AVR GCC + avr-libc | 7.3.0 | XMEGA and ATmega (CW-Lite XMEGA, CW304, ...) | [Arduino](https://github.com/arduino/toolchain-avr) |
|
|
271
|
+
| GNU RISC-V GCC | 15.2.0 | NEORV32, Ibex, FE310 | [xPack](https://xpack-dev-tools.github.io/riscv-none-elf-gcc-xpack/) |
|
|
272
|
+
| LLVM clang | 21 | Arm, AVR and RISC-V | [Zig 0.16.0](https://ziglang.org/download/) |
|
|
273
|
+
| GNU make + sh | 4.4.1 | Windows only | [xPack](https://xpack-dev-tools.github.io/windows-build-tools-xpack/) |
|
|
274
|
+
|
|
275
|
+
Clang builds compile every C file with clang and let GCC assemble the startup files and link against newlib or avr-libc, so the firmware uses the same C library and linker scripts as a GCC build. For targets without a free pinned toolchain (TriCore, PowerPC, RX) or to pin a specific compiler, add a **custom toolchain** from an archive URL or an existing folder. Compilers already on your `PATH` are detected and used as a fallback.
|
|
276
|
+
|
|
277
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/toolchains-light.png"><img alt="Toolchains with their versions, sizes and install state" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/toolchains.png"></picture>
|
|
278
|
+
|
|
279
|
+
### Sources come from NewAE, not from Studio
|
|
280
|
+
|
|
281
|
+
Firmware sources are not packed into Studio either. Studio downloads `firmware/mcu` and the matching `chipwhisperer-fw-extra` HALs straight from [newaetech/chipwhisperer](https://github.com/newaetech/chipwhisperer) and follows a channel of your choice: `develop` (default), the latest release, or any tag or commit. **Check for updates** compares your copy with GitHub and **Update now** pulls new examples and fixes without a new Studio release. You can also point Studio at your own ChipWhisperer checkout to build local changes. If you hit GitHub's limit of 60 anonymous API requests per hour (for example on a shared network), set a `GITHUB_TOKEN` environment variable and Studio will use it for these lookups.
|
|
282
|
+
|
|
283
|
+
### Platform coverage
|
|
284
|
+
|
|
285
|
+
Every Arm, AVR and RISC-V platform in ChipWhisperer builds with GCC, apart from three whose upstream HAL sources are broken (CW308_EFM32GG11, CW308_PSOC62, CW308_NRF52). With clang, 28 of the 38 platforms build, including all the common ones (CWLITEARM, CWNANO, CWHUSKY, CWLITEXMEGA, CW304, STM32F0 to F4, SAM4S, K82F, NEORV32, Ibex); a few HALs use GCC-only constructs, so use GCC for those. AURIX, RX65N and MPC5676R need a custom toolchain. Builds are verified in CI on Linux, Windows and macOS.
|
|
286
|
+
|
|
287
|
+
## AI agents (MCP)
|
|
288
|
+
|
|
289
|
+
`cw-studio mcp` runs a [Model Context Protocol](https://modelcontextprotocol.io) server with 106 tools for everything in the UI: connecting, every scope and target setting, programming, serial and SimpleSerial I/O, capture with all its options, trace access and export, CPA, glitch sweeps, toolchains, firmware sources and builds, the hardware interfaces (UART, SPI, GPIO, triggers, bit-banger, OpenOCD), logic capture and decoding, the code map, running notebook code and whole notebooks (including NewAE's tutorials) in their own kernels, notes and the calculator. It also offers guided prompts (a CPA attack and a glitch search) and live status resources.
|
|
290
|
+
|
|
291
|
+
If Studio is already running, the MCP server attaches to it, so you can watch the agent capture and analyse in Studio's window. Otherwise it starts a headless Studio in the background.
|
|
292
|
+
|
|
293
|
+

|
|
294
|
+
|
|
295
|
+
<picture><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/mcp-setup-light.png"><img alt="MCP setup in the Help tab" src="https://raw.githubusercontent.com/keyuraghao/chipwhisperer-studio/v0.5.1/docs/wiki/images/mcp-setup.png"></picture>
|
|
296
|
+
|
|
297
|
+
**Claude Code:**
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
claude mcp add chipwhisperer-studio -- cw-studio mcp
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**Claude Desktop, Cursor and other clients:**
|
|
304
|
+
|
|
305
|
+
```json
|
|
306
|
+
{
|
|
307
|
+
"mcpServers": {
|
|
308
|
+
"chipwhisperer-studio": { "command": "cw-studio", "args": ["mcp"] }
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
With the standalone bundle, use the full path to `ChipWhispererStudio` as the command (on Windows, `cw-studio.exe` in the window build); the Help tab shows the exact command for your installation. Useful options: `--simulate` (no hardware), `--url http://host:8765` (attach to a remote Studio), `--transport streamable-http --mcp-port 8766` (serve MCP over HTTP), `--no-embed` (never start a headless Studio).
|
|
314
|
+
|
|
315
|
+
Try asking your agent: *"Connect to the simulator, capture 100 traces with a fixed key and recover the key with CPA"*, *"Build simpleserial-glitch for CWLITEARM, flash it and find a glitch width and offset that skip the loop"* or *"Capture the demo traffic, decode the I2C bus and tell me which addresses NACKed."*
|
|
316
|
+
|
|
317
|
+
## HTTP API and remote use
|
|
318
|
+
|
|
319
|
+
Everything the UI and the MCP server do goes through a documented HTTP API; open `/api/docs` for the list of endpoints and the [HTTP API wiki page](https://github.com/keyuraghao/chipwhisperer-studio/wiki/HTTP-API) for details. Start Studio with `--host 0.0.0.0` on the machine that has the hardware and use it from any browser on the network, or drive captures from scripts and CI.
|
|
320
|
+
|
|
321
|
+
Studio has a light and a dark theme (the sun and moon button in the top bar):
|
|
322
|
+
|
|
323
|
+
| Dark | Light |
|
|
324
|
+
|------|-------|
|
|
325
|
+
|  |  |
|
|
326
|
+
|
|
327
|
+

|
|
328
|
+
|
|
329
|
+
## Performance
|
|
330
|
+
|
|
331
|
+
<!-- performance:start -->
|
|
332
|
+
|
|
333
|
+
Latest run: 2026-10-01, Studio 0.4.4, on AMD Ryzen 9 5900HS with Radeon Graphics with 39 GB RAM (Linux 7.1.5+kali-amd64). Captures use the built-in simulator, so they measure Studio itself; with real hardware the scope and target set the capture rate. The detailed tables, the comparison with the previous run and how to run the tests are on the [Performance](https://github.com/keyuraghao/chipwhisperer-studio/wiki/Performance) wiki page.
|
|
334
|
+
|
|
335
|
+
| Test | Result |
|
|
336
|
+
|---|---|
|
|
337
|
+
| Largest trace set held (200,000 x 5,000 samples) | 3.73 GB of traces in 3.79 GB of memory |
|
|
338
|
+
| Mean/min/max of all 200,000 traces | 2.6 s the first time, extra memory +65 MB |
|
|
339
|
+
| API under load (50,000 traces, 8 clients, capture running) | status 1.5 ms, one trace 1.5 ms, trace block (200) 31.6 ms, mean/min/max 5.9 ms, settings tree 3.9 ms (medians) |
|
|
340
|
+
| Simulated capture, 5,000 samples per trace | 5,685 traces/s (108 MB/s) stored |
|
|
341
|
+
| CPA on 100,000 x 5,000 traces | 27 s, key recovered: yes |
|
|
342
|
+
| Export 100,000 traces (1.9 GB) to .npz | 35 s (54 MB/s), import 9 s |
|
|
343
|
+
| Memory leak tests | 7 of 7 workloads without growth |
|
|
344
|
+
| Browser during a long live capture | 5,000 samples: 60 fps, heap +0.0 MB; 100,000 samples: 24 fps, heap -0.1 MB; 131,070 samples: 20 fps, heap -0.1 MB |
|
|
345
|
+
|
|
346
|
+
**Run history**
|
|
347
|
+
|
|
348
|
+
| Date | Studio | Commit | Machine | Result files |
|
|
349
|
+
|---|---|---|---|---|
|
|
350
|
+
| 2026-10-01 | 0.4.4 | `1f274ab` | AMD Ryzen 9 5900HS with Radeon Graphics, 39 GB, Linux | [2026-10-01-v0.4.4.json](https://github.com/keyuraghao/chipwhisperer-studio/blob/v0.5.1/docs/benchmarks/2026-10-01-v0.4.4.json) |
|
|
351
|
+
| 2026-10-01 | 0.4.3 | `7a3473a` | AMD Ryzen 9 5900HS with Radeon Graphics, 39 GB, Linux | [2026-10-01-v0.4.3.json](https://github.com/keyuraghao/chipwhisperer-studio/blob/v0.5.1/docs/benchmarks/2026-10-01-v0.4.3.json) |
|
|
352
|
+
|
|
353
|
+
<!-- performance:end -->
|
|
354
|
+
|
|
355
|
+
## Architecture
|
|
356
|
+
|
|
357
|
+

|
|
358
|
+
|
|
359
|
+
Studio is one Python process: a Starlette server (with a small built-in router) that serves the web UI, the HTTP API and a WebSocket for live traces, shown in Studio's own window (the system web view) or a browser. A single worker thread owns the USB hardware and runs captures, glitch sweeps, logic captures, interface requests and every notebook's cells in turn, while CPA, logic decoding, firmware emulation, toolchain downloads and firmware builds run on their own threads (big logic decodes in a worker process). A capabilities module decides what the connected model can do for every tab and the API. The MCP server is another client of the same API. Details are in [docs/DESIGN.md](https://github.com/keyuraghao/chipwhisperer-studio/blob/v0.5.1/docs/DESIGN.md) and on the [Architecture](https://github.com/keyuraghao/chipwhisperer-studio/wiki/Architecture) wiki page.
|
|
360
|
+
|
|
361
|
+
## Development
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
git clone https://github.com/keyuraghao/chipwhisperer-studio
|
|
365
|
+
cd chipwhisperer-studio
|
|
366
|
+
pip install -e ".[test]"
|
|
367
|
+
cw-studio --simulate --log-level debug
|
|
368
|
+
python -m pytest
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
The frontend has no build step: edit `src/cwstudio/static/**` and reload the page (`cw-studio --browser` is handy while developing).
|
|
372
|
+
|
|
373
|
+
| Task | Command |
|
|
374
|
+
|------|---------|
|
|
375
|
+
| Standalone bundles for this OS | `python packaging/build.py` (PyInstaller; produces `dist/ChipWhispererStudio-<os>-<arch>.zip`) and `python packaging/build.py --variant web` (`dist/ChipWhispererStudio-Web-<os>-<arch>.zip`) |
|
|
376
|
+
| Regenerate the screenshots (dark and light) | `pip install playwright && playwright install chromium && python tools/screenshots.py` |
|
|
377
|
+
| Record the video tour and its clips | `pip install imageio-ffmpeg && python tools/demo_video.py` |
|
|
378
|
+
| Release notes for a version | `python tools/release_notes.py 0.5.0` |
|
|
379
|
+
|
|
380
|
+
Pinned toolchain versions and checksums live in `src/cwstudio/resources/toolchains.json`. To publish a new compiler version, update that file and bump its `revision`; running Studios pick it up with **Refresh list**.
|
|
381
|
+
|
|
382
|
+
## Releases
|
|
383
|
+
|
|
384
|
+
Release notes for every version are in [CHANGELOG.md](https://github.com/keyuraghao/chipwhisperer-studio/blob/v0.5.1/CHANGELOG.md). To cut a release, move the Unreleased notes under a new version heading, bump `__version__` in `src/cwstudio/__init__.py` and push a tag such as `v0.5.0`. CI then runs the tests and firmware builds on all three operating systems, builds the standalone bundles (window and Web builds for each OS) and the Python packages, publishes a GitHub release using the matching CHANGELOG section as its description, and uploads the Python packages to [PyPI](https://pypi.org/project/chipwhisperer-studio/).
|
|
385
|
+
|
|
386
|
+
## License
|
|
387
|
+
|
|
388
|
+
Apache License 2.0, the same as ChipWhisperer. See [LICENSE](https://github.com/keyuraghao/chipwhisperer-studio/blob/v0.5.1/LICENSE) and [NOTICE](https://github.com/keyuraghao/chipwhisperer-studio/blob/v0.5.1/NOTICE). Compilers downloaded by Studio are covered by their own licences.
|