Skip to main content

Statistical Testing of RAndom Probing Security

Reason this release was yanked:

C++ library is not in the build and broken dependencies.

Project description

STRAPS

Statistical Testing of RAndom Probing Security

This tool is described in the paper Towards Tight Random Probing Security.

Install

STRAPS is distributed as a python package (with compiled native code in it).

Dependencies:

  • python >= 3.10 (for older python, see version 0.1.2)
  • pip

(On Ubuntu: apt install python3 python3-pip. On Windows, install from https://python.org.)

Install command

pip install straps

or (install for local user only):

pip install --user straps

We do not currently build for Mac OS (working CI configuration contribution is welcome), but you can build it for yourself (see below).

If the installation fails after "Building wheel for straps [...]", it is probably due to the use of an old version of pip. If updating it is not possible, you may also do it in python virtual environment:

python3 -m venv ve_straps
source ve_straps/bin/activate
python3 -m pip install -u pip
python3 -m pip install straps

Usage

Simple demo

python -m straps.secfig isw

Run

python -m straps.secfig --help

to see all options.

Running python -m straps.paper_plots generates all figures of the paper (this might take dozens of hours on a beefy machine).

Cache

If the environment variable STRAPS_CACHE_DIR is defined, it will be used as the path for a cache directory. This cache stores PDT computation resuts across executions, and also during one execution. It is therefore strongly recommended to set this variable, as it might lead to large runtime reductions, even on a single run.

Custom composition

from straps import eval_circs, sh_pdt, pdt_sampling, secfig

def eval_x_cube(p, pdts, d):
    """Composition to compute ISW-mul(x, x**2) (without refreshing)."""
    # Create the Shared PD with one output sharing
    x = sh_pdt.ShPd(['out'], d)
    # We build the circuit from the output: we start from the output sharing,
    # create the gadget that generates it, then work backwards until we reach
    # the intput.
    # ISW multiplication
    x.op('out', ['t0', 't1'], pdts['ISW'])
    x.op('t0', ['t0'], pdts['square'])
    x.split_sharing('in', 't0', 't1')
    return x.security('in')

## Then, either run
# Set the parameters:
k = "ub" # ub (upper bound) or lb (statistical-only lower bound)
e = 1e-6 # statistical confidence level
d = 3 # number of shares
n_s_max = 10**5 # N_max
suff_thresh = 100 # N_t
p = 1e-2 # parameter of the random probing model
pdts = {
    circ: pdt_sampling.gpdt(circ, d, k, e, n_s_max, suff_thresh, True, False).instantiate(p)
    for circ in ["ISW", "square"]
    }
# Get the security level:
security_level = eval_x_cube(p, pdts, d)

## Or, if you want to integrate with provided utils:
# Put in base_circuits your custom function and the list of gadgets you use
eval_circs.base_circuits["custom_cube_implem"] = (eval_x_cube, lambda **kwargs: ['ISW', 'square'])
# Put in specialized_circuits a display name, and the name of your base_circuits entry
# (and a dict of optional parameter to your function).
eval_circs.specialized_circuits["custom_cube"] = ("ISW Cube w/o refresh", "custom_cube_implem", {})
# Then, you can use our top-level functions, e.g.
import numpy as np
from matplotlib import pyplot as plt
ds = [1, 2, 3] # number of shares
ps = np.logspace(-4, 0, 50) # parameter of the random probing model
e = 1e-6 # statistical confidence level
n_s_max = 10**5 # N_max
suff_thresh = 100 # N_t
secfig.plot_fig(**secfig.data_fig("custom_cube", ds, e, ps, n_s_max, suff_thresh))
plt.show()

See straps/eval_circs.py for more examples (such as the AES S-box).

Custom gadget

Your can also design your own gadget.

from straps import circuit_model

# Define the gadget.
def custom_gadget(d):
    """Custom gadget with d shares."""
    if d != 2:
        raise ValueError("This gadget works only with 2 shares.")
    c = circuit_model.Circuit(d)
    # two input sharings: (in00, in01) and (in10, in11)
    in00 = c.var("in00", kind="input", port=(0, 0))
    in01 = c.var("in01", kind="input", port=(0, 1))
    in10 = c.var("in10", kind="input", port=(1, 0))
    in11 = c.var("in11", kind="input", port=(1, 1))
    # one output sharing (out0, out1)
    out0 = c.var("out0", kind="output", port=(0, 0))
    out1 = c.var("out1", kind="output", port=(0, 1))
    # a fresh random
    r = c.var("r", kind="random")
    # intermediate variables
    w = c.var("w")
    x = c.var("x")
    y = c.var("y")
    # circuit gates
    c.l_sum(w, (in00, r)) # XOR gate: x = in00 XOR r
    c.l_sum(x, (w, in01))
    c.l_sum(y, (in10, in11)) # NB: leaks at first-order.
    c.l_prod(out0, (y, x)) # AND gate: out0 = x AND y
    c.l_prod(out1, (y, r))
    return c

# Integrate the gadget in the list of available gadgets:
from straps import simple_circuits
simple_circuits.all_circs["my_custom_gadget"] = custom_gadget

# Then you can use "my_custom_gadget" in any custom composition (see Custom
# composition section). E.g.
from straps import sh_pdt, eval_circs
def eval_custom_gadget(p, pdts, d, sec_input="in0"):
    x = sh_pdt.ShPd(['out'], d)
    x.op('out', ['in0', 'in1'], pdts['my_custom_gadget'])
    return x.security(sec_input)

eval_circs.base_circuits["custom_gadget"] = (
        eval_custom_gadget, lambda **kwargs: ['my_custom_gadget']
)
eval_circs.specialized_circuits["custom_gadget_in0"] = ("Custom Gadget in 0", "custom_gadget", {'sec_input': 'in0'})
eval_circs.specialized_circuits["custom_gadget_in1"] = ("Custom Gadget in 1", "custom_gadget", {'sec_input': 'in1'})
# You can then evaluate the security with straps.secfig (see Custom composition section).

Build

If you want to build STRAPS yourself, you will need the following for all platforms:

  • A stable rust compiler with cargo (install e.g. from https://rustup.rs)
  • Python (>= 3.6)
  • The boost library:
    • On Ubuntu (20.04):
    apt install libboost-all-dev
    
    • On RHEL/CentOS:
    yum install boost-devel
    
    choco install boost-msvc-14.2
    
    (Assuming Visual Studio 2019)
  • A C++ compiler
    • On Ubuntu (20.04):
    apt install gcc g++
    
    • On RHEL/CentOS:
    yum install gcc gcc-g++
    
    • On Windows install Visual Studio 2019 with C++ extensions.

Then, run

python setup.py develop

to install STRAPS in development mode. For Windows, you need to the the environment variable CXXFLAGS=-I C:/Local/boost_1_74_0 (adjust according to your boost version).

License

STRAPS is licensed under the GNU AGPL, version 3 or later. See COPYING for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

straps-0.1.3.tar.gz (63.6 kB view details)

Uploaded Source

Built Distributions

straps-0.1.3-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13 Windows x86-64

straps-0.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

straps-0.1.3-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12 Windows x86-64

straps-0.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

straps-0.1.3-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11 Windows x86-64

straps-0.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

straps-0.1.3-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10 Windows x86-64

straps-0.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

File details

Details for the file straps-0.1.3.tar.gz.

File metadata

  • Download URL: straps-0.1.3.tar.gz
  • Upload date:
  • Size: 63.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for straps-0.1.3.tar.gz
Algorithm Hash digest
SHA256 c49facc32f2f1a3633bbcbc49786c10304187f03fdb3d5577fb62c097b660e75
MD5 af1edae85023e8a44d80fb2e1ba00ad9
BLAKE2b-256 d647c6b54997a3fd47cae3e6782819a8ca4942c80c7da435843eafa061a02dd7

See more details on using hashes here.

File details

Details for the file straps-0.1.3-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: straps-0.1.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for straps-0.1.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 3d78583cd0b48d97d2340c8ffc7b357d8df6dcbd3be3ffe418c9e2e5574795cd
MD5 7bf3bdc896798b5f62cae85e2f5ef411
BLAKE2b-256 4e4f43f07db719d88263604d1489a68dd650030b2330e2179daa6ab30f6e5a32

See more details on using hashes here.

File details

Details for the file straps-0.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for straps-0.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 687bf4c69aa5df89e1f9af46539ec577c8a46997b2bd35c7ffd8fdb536809a7d
MD5 7665faadb529dc340ba3f7f45182df9a
BLAKE2b-256 a1519c7590f0ffcc81d4301be45d13fbff34dd8bbce147c7aff7a266a3ab0c56

See more details on using hashes here.

File details

Details for the file straps-0.1.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: straps-0.1.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for straps-0.1.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7acb24d8eac5eb1f06acc8e8619a5443a43316d9601d7f8db12f69729790ca12
MD5 a9590660eacfdacb8d02c4113abb3e2a
BLAKE2b-256 5d7e45dd717e3dec0003a13ee7d768f6af2e8d21367ec15d754482be16d54d79

See more details on using hashes here.

File details

Details for the file straps-0.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for straps-0.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 61fec07811668d728c495489bfbcbd60ef2bf379bd12338e4a6696547c6c15b8
MD5 e4aa4bdd12880fc3dcf24b4e46606144
BLAKE2b-256 25a32884b71205998be586500d888e6d8d8295ad3455d76ecb6c049cc90076b0

See more details on using hashes here.

File details

Details for the file straps-0.1.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: straps-0.1.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for straps-0.1.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 13d55dd99fe470803a37ff9d2e822d574f1588f041e7c7a7ac7eafe21958aa0c
MD5 80b54480b8956e98c8a00e1c73b10a82
BLAKE2b-256 bd21630ad1ba4df49fd4fddcb661c9c3e9ee16be77d8b80d1cedba7856ce8f1f

See more details on using hashes here.

File details

Details for the file straps-0.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for straps-0.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d276ef43d2b193d62b13ebf802d75395f0870c6866ddeea99e9ceb884e664643
MD5 3a09c0278dc62a16c61f8edeafbd784b
BLAKE2b-256 5d174f5dbfe7c26644c6b1b6f41df84030de72b903d1f8c31b7f9c5c63c0835d

See more details on using hashes here.

File details

Details for the file straps-0.1.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: straps-0.1.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for straps-0.1.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 bc2dea5fe9bacfa7ee17baa6602908c68bbf3fcf1685fad62562ab877e5f9aed
MD5 e183990ff02ee3a22254912055ec246f
BLAKE2b-256 2e8e3f90b7a7cac466cc22cb221dd9aa36766a7960b982bfc4096bfbf871c089

See more details on using hashes here.

File details

Details for the file straps-0.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for straps-0.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 df57b7de5bb8b2059bb7b3bc456b648570993bc96387c28c69b7e3e66f522823
MD5 e72ba641488d938066b8a9ca1bc67dc9
BLAKE2b-256 e82159bac0848e68116c1bfca5e2aeb5958e8d46c588fafb9b8591ce9dfc01f7

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page