International Association for Cryptologic Research

International Association
for Cryptologic Research

Transactions on Cryptographic Hardware and Embedded Systems 2025

Adaptive Template Attacks on the Kyber Binomial Sampler


README

Adaptive Template Attacks on the Kyber Binomial Sampler

Eric Chun-Yu Peng, Markus G. Kuhn

This repository contains the Julia code
needed for reproducing the experiments described in our paper

Eric Chun-Yu Peng, Markus G. Kuhn: Adaptive Template Attacks on the
Kyber Binomial Sampler
.
IACR Transactions on Cryptographic Hardware and Embedded
Systems
, Vol. 2025, No. 3.

Requirements

This code was mainly developed and tested on x86-64 (64-bit)
computers running Ubuntu Linux 20.04 or 24.04 with 48 GB RAM. We hope
it will run on any platform that is supported by
Julia
and has
at least 16 GB RAM. About 25 GB disk space would be ideal, but there
are also ways to run the demo with only about 12 GB disk space.

Install Julia

To run this code, you will need Julia
(version 1.11 or newer).

For Linux or macOS, best install
Julia
via the
juliaup
installation manager using the following shell command line:

$ curl -fsSL https://install.julialang.org | sh

Download this repository

Clone this repository and its submodules to your local machine, then install
(“instantiate”) the required Julia package dependencies for this project
into your Julia depot path (default: ~/.julia/):

$ git clone --recursive https://github.com/eric-cyp24/Kyber768cbd.jl.git
$ cd Kyber768cbd.jl
$ julia --project -e "import Pkg; Pkg.instantiate()"

Download trace data for DK2 and MS2

This repository contains only Julia code. To reproduce some of the
experiments from the paper, you also need to separately download the
data used.

The following Julia script will download preprocessed traces for two
devices (4000 traces to profile DK2 and 1000 traces each to attack
KeyGen (K) and Encaps (E) on MS2). It will also download pre-built
post-LDA templates for the other devices.

(The downloaded traces have already been downsampled from 2.5 GHz to
100 MHz using a Lanczos anti-aliasing filter, and have then been cut
into 48 segments each, as detailed in sections 3, 4.3 and 5.3 of the
paper.)

The script will download this data into the folder data/ (into
subfolder Traces/), unless you specify another folder using the
environment variable DATA_DIR. This folder will later also be used
for temporary data.

Choose one of the following options, depending on how much disk space
you have:

Build tables 2 and 3

You can run the following Julia script to generate the LaTeX table source code
for tables 2 and 3, and pdflatex to generate these tables as
results/SuccessRateTables.pdf.

$ julia --project scripts/h5result2latextable_multiboardsingletrace.jl
$ pdflatex -output-directory results scripts/SuccessRateTables.tex

If you downloaded the results for other target devices than MS2, you
should see those columns already completed:

Success Rate Table

To complete the still missing MS2 columns:
- First, build the DK2 profiling templates with the following profiling step.
- Then, run the single-trace attacks on the MS2 target with templates from all
devices (DK1–RS2).

Profiling

Build the LDA-based templates from profiling traces of device DK2:
data/Traces/SOCKET_HPF/DK2/test_20241219/lanczos2_25/traces_lanczos2_25_proc.h5.
The resulting templates will be stored in the folder
data/Traces/SOCKET_HPF/DK2/test_20241219/lanczos2_25/Templates_POIe40-80/.

$ julia --project scripts/downloaddata.jl --profiling    # for Option 2 only
$ julia --project scripts/profiling_kyber768cbd.jl
$ julia --project scripts/deletedata.jl --profiling      # for Option 2 only

Single-trace attacks

Run the single-trace attacks on the MS2 target device:

$ julia --project scripts/downloaddata.jl --attack       # for Option 2 only
$ julia --project scripts/attack_kyber768cbd_Buf_singletrace.jl

You can speed up the attack by running Julia with multiple threads:

$ julia --project -t4 scripts/attack_kyber768cbd_Buf_singletrace.jl

Option -t4 tells Julia to execute with 4 threads.
Adjust this based on your computer's resources, i.e. speed up the
computation with more threads or decrease RAM usage with fewer.
Each attack trace set (table cell) takes 3–15 minutes to finish.
Therefore, this script may run for a while (roughly 4–5 hours on
our computers).

The attack results will be stored as HDF5 files in folder
data/Traces/SOCKET_HPF/MS2/test_20241221/lanczos2_25_test_K/Results/Templates_POIe40-80/.

To see more detailed attack metadata, use an HDF5 viewer, e.g.
HDFView Software or
myHDF5 online viewer; or open the file
directly with the HDF5.jl package
in Julia, as in

$ julia --project
julia> using HDF5
julia> h = h5open("data/Traces/SOCKET_HPF/MS2/test_20241221/lanczos2_25_test_K/Results/Templates_POIe40-80/marginalize_Buf_Result_with_Templates_POIe40-80_from_SOCKET_HPF_DK2_test_20241219.h5")
julia> h["Traces_Normalized_Templates_Adj_EM"]["success_rate_single_trace"][]
0.777

Attacking the Encaps operation

To attack the Encaps operation (Table 3 above), run the same attack
script with the additional command line argument: --targetOP Encaps

$ julia --project scripts/attack_kyber768cbd_Buf_singletrace.jl --targetOP Encaps

Generate (LaTeX) tables

To view the single-trace attack results, run the following code (again) to
generate results/SuccessRateTables.pdf with the newly produced success
rates:

$ julia --project scripts/h5result2latextable_multiboardsingletrace.jl
$ pdflatex -output-directory results scripts/SuccessRateTables.tex

Adaptive template attack evaluation

EM adjustment XY

To view the effect of the EM-based template adjustment, run the following
script:

$ julia --project scripts/figure_emadj_templates.jl --variable XY --output results/traces_and_XY_templates.png

This generates the before-and-after plots (a) and (b) from Figure 5,
stored in the results/ folder as
traces_and_XY_templates.png and traces_and_XY_templates_EMadj.png.

If you want to see the effect of EM template adjustment on a lower-leakage
intermediate variable (iv), modify the command line options for the script:

$ julia --project scripts/figure_emadj_templates.jl --variable X --output results/traces_and_X_templates.png

You should now see plots (c) and (d) from Figure 5 in
traces_and_X_templates.png and traces_and_X_templates_EMadj.png,
also in the results/ folder, similar to the ones shown below.
EM adjustment X