Skip to main content

python-libprio

This module contains a Python wrapper around libprio.

Quickstart

Install the required dependencies via the system package manager and install the package from pip. The shared libraries for msgpack and NSS must be available for the module to initialize properly.

On an image derived from Ubuntu:

docker run -it python:3 bash
apt update && apt install libmsgpackc2 libnss3

On Centos:

docker run -it centos:8 bash
dnf update && dnf install epel-release && dnf install python36 msgpack nss

On macOS:

brew install msgpack nss

To test the package:

pip3 install prio
python3 -c "from prio.libprio import *; Prio_init(); print(PrioPRGSeed_randomize())"

Building from source

Ensure all of the libprio build tools are available, such as scons and clang

python3 -m venv venv
source venv/bin/activate
make install

# run tests
pip install pytest
python -m pytest

To run a coverage report:

pip install pytest-cov
python -m pytest --cov-report=html --cov-report=term --cov=prio tests

Distributing

Binary eggs and wheels are built for Python 3.6, 3.7, and 3.8 for macOS 10.15 and Linux. From the project root, run the following command to distribute the wheels for macOS.

export TWINE_REPOSITORY=testpypi  # optional: for testing
export TWINE_USERNAME=__token__
export TWINE_PASSWORD=<API_KEY>
./scripts/python-dist.sh

Run the docker container for distributing the linux wheels.

docker-compose build libprio-dist
export TWINE_USERNAME=__token__
export TWINE_PASSWORD=<API_KEY>
docker-compose run -e TWINE_USERNAME -e TWINE_PASSWORD libprio-dist

Build Process

There are issues running an installation of the extension module inside of the current directory (i.e. libprio/python). The directory is the first item on the PYTHONPATH. The extension module cannot be referenced until it has been completely packaged, due to the implicit import statement made by the swig wrapper:

from . import _libprio

The directory sturcture of module after running python setup.py build shows the intermediate shared object stored in a directory underneath build.

# make

% tree prio build
prio
├── __init__.py
└── libprio.py
build
├── lib.macosx-10.15-x86_64-3.8
│   └── prio
│       ├── __init__.py
│       ├── _libprio.cpython-38-darwin.so
│       └── libprio.py
└── temp.macosx-10.15-x86_64-3.8
    └── libprio_wrap.o

The package references are valid once installed into the Python site packages.

# python3 -m venv venv
# source venv/bin/activate
# make install

% tree venv/lib/python3.8/site-packages/prio
venv/lib/python3.8/site-packages/prio
├── __init__.py
├── __pycache__
│   ├── __init__.cpython-38.pyc
│   └── libprio.cpython-38.pyc
├── _libprio.cpython-38-darwin.so
└── libprio.py

1 directory, 5 files

See this StackOverflow post for reference.

Multiprocessing on Linux

There are certain pathological behaviors that exibit themselves when run on a specific operating system. Due to the way that NSS is initialized, naive multiprocessing using the %init block and atexit in the SWIG interface file will fail on the multiprocessing test in Linux, but not on macOS. Management of the Prio context must be done by the library user.

=================================== FAILURES ===================================
____________________ test_multiprocessing_encoding_succeeds ____________________
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 119, in worker
    result = (True, func(*args, **kwds))
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 47, in starmapstar
    return list(itertools.starmap(args[0], args[1]))
  File "/app/python/tests/test_libprio_multiprocessing.py", line 14, in _encode
    for_server_a, for_server_b = PrioClient_encode(cfg, data_items)
  File "/usr/local/lib64/python3.6/site-packages/prio/libprio.py", line 380, in PrioClient_encode
    return _libprio.PrioClient_encode(cfg, data_in)
RuntimeError: PrioClient_encode was not successful.
"""

The above exception was the direct cause of the following exception:

    def test_multiprocessing_encoding_succeeds():
        _, pkA = Keypair_new()
        _, pkB = Keypair_new()
        internal_hex = PublicKey_export_hex(pkA)
        external_hex = PublicKey_export_hex(pkB)

        pool_size = 2
        num_elements = 10

        p = Pool(pool_size)
>       res = p.starmap(_encode, [(internal_hex, external_hex)] * num_elements)

python/tests/test_libprio_multiprocessing.py:28:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.6/multiprocessing/pool.py:274: in starmap
    return self._map_async(func, iterable, starmapstar, chunksize).get()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <multiprocessing.pool.MapResult object at 0x7f7a86db0048>, timeout = None

    def get(self, timeout=None):
        self.wait(timeout)
        if not self.ready():
            raise TimeoutError
        if self._success:
            return self._value
        else:
>           raise self._value
E           RuntimeError: PrioClient_encode was not successful.

/usr/lib64/python3.6/multiprocessing/pool.py:644: RuntimeError
=========================== short test summary info ============================
FAILED python/tests/test_libprio_multiprocessing.py::test_multiprocessing_encoding_succeeds
========================= 1 failed, 20 passed in 0.49s =========================

Metadata

Release files for prio 1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for prio 1.1
File
prio-1.1-cp39-cp39-manylinux1_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.5+ x86-64 Details
prio-1.1-cp38-cp38-manylinux1_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.5+ x86-64 Details
prio-1.1-cp38-cp38-macosx_10_15_x86_64.whl CPython 3.8 CPython 3.8 macOS 10.15+ x86-64 Details
prio-1.1-cp37-cp37m-manylinux1_x86_64.whl CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.5+ x86-64 Details
prio-1.1-cp37-cp37m-macosx_10_15_x86_64.whl CPython 3.7 CPython 3.7 pymalloc macOS 10.15+ x86-64 Details
prio-1.1-cp36-cp36m-manylinux1_x86_64.whl CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.5+ x86-64 Details
prio-1.1-cp36-cp36m-macosx_10_15_x86_64.whl CPython 3.6 CPython 3.6 pymalloc macOS 10.15+ x86-64 Details

Total release size: 766.3 kB

Release files / prio-1.1-cp39-cp39-manylinux1_x86_64.whl

Download URL prio-1.1-cp39-cp39-manylinux1_x86_64.whl
Size 139.7 kB
Tags CPython 3.9 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
fae7ced7e65b7f33a37064ed31a18493f670ed9d96c6c88f7d201681b172edc4
BLAKE2b-256 checksum
How to use checksums
44cee31561116a7962d1df6729c29b26cbb3b44c295ec061e50baf3657e08978
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.8.4

Release files / prio-1.1-cp38-cp38-manylinux1_x86_64.whl

Download URL prio-1.1-cp38-cp38-manylinux1_x86_64.whl
Size 142.6 kB
Tags CPython 3.8 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
62c6163b290055338a487da0ad458bc3362b1eaffcacc42dc049c4493712eb38
BLAKE2b-256 checksum
How to use checksums
f869efd8db3ec8943ece7898d074692963b0a1bbb762e8ceebd65ba1f2461899
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.8.4

Release files / prio-1.1-cp38-cp38-macosx_10_15_x86_64.whl

Download URL prio-1.1-cp38-cp38-macosx_10_15_x86_64.whl
Size 69.7 kB
Tags CPython 3.8 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
ff7f5a919796207562f788a9fd1459245f17a10ce540b2ee80b9ec044f5c5caf
BLAKE2b-256 checksum
How to use checksums
c23b7fc44c00ea56a071680fdfda15987164d1551098fdfb00be1d949dcaf006
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.23.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.3

Release files / prio-1.1-cp37-cp37m-manylinux1_x86_64.whl

Download URL prio-1.1-cp37-cp37m-manylinux1_x86_64.whl
Size 138.1 kB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
ddd99c5d1ef146045917e9837c29a852833d435e41b5f9a0ed775cccaa8502fc
BLAKE2b-256 checksum
How to use checksums
6d8b69b786893dd846fac41ab9ffbbe3e1a9df1ae9d56195e8ac6af07593dbf1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.8.4

Release files / prio-1.1-cp37-cp37m-macosx_10_15_x86_64.whl

Download URL prio-1.1-cp37-cp37m-macosx_10_15_x86_64.whl
Size 69.5 kB
Tags CPython 3.7 CPython 3.7 pymalloc macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
6c46a06da0beee4ee84b8371d0edaaa40061d666ccba4fcaf1339479660e39d2
BLAKE2b-256 checksum
How to use checksums
e2a451d57cf576c99e19f3050dc7d057199079bf5e48725fc8c9b141b2c9a137
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.23.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.3

Release files / prio-1.1-cp36-cp36m-manylinux1_x86_64.whl

Download URL prio-1.1-cp36-cp36m-manylinux1_x86_64.whl
Size 137.1 kB
Tags CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
7d76e244cd821108665a9ed1c74dc0124c51761c88c612f0736e4b3edf3a7f50
BLAKE2b-256 checksum
How to use checksums
06e4c770f4201c77533f17f0552354d8a06ee1c2b7a5671236690e358a806282
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.8.4

Release files / prio-1.1-cp36-cp36m-macosx_10_15_x86_64.whl

Download URL prio-1.1-cp36-cp36m-macosx_10_15_x86_64.whl
Size 69.5 kB
Tags CPython 3.6 CPython 3.6 pymalloc macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
e9336660f7eae368cff7b59bd7192456a9ce58daa0f3c19cb272dbb734b5ee1c
BLAKE2b-256 checksum
How to use checksums
caec298b94d1c89b6386058ce04ca8c9064f31101376c8389f76de7402198a05
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.23.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.3

Release history Release notifications | RSS feed

This release

1.1 This release

7 release files

1.0.3

7 release files

0.2

1 release file

0.1.5

1 release file

0.1.4

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page