lhe 0.9.0
Leveled homomorphic encryption library supportingup to three multiplications and unlimited additions.
License: MIT

===
lhe
===

Python library supporting level-4 homomorphic encryption, implemented as `lifted ElGamal (level-2 HE) on BN254 <https://www.slideshare.net/herumi/efficient-twolevel-homomorphic-encryption-in-primeorder-bilinear-groups-and-a-fast-implementation-in-webassembly>`__ and "boost" it using `the Catalano-Fiore transformation <https://eprint.iacr.org/2014/813.pdf>`__.

|pypi| |readthedocs| |actions| |coveralls|

.. |pypi| image:: https://badge.fury.io/py/lhe.svg
   :target: https://badge.fury.io/py/lhe
   :alt: PyPI version and link.

.. |readthedocs| image:: https://readthedocs.org/projects/lhe/badge/?version=latest
   :target: https://lhe.readthedocs.io/en/latest/?badge=latest
   :alt: Read the Docs documentation status.

.. |actions| image:: https://github.com/nthparty/lhe/workflows/lint-test-cover-docs/badge.svg
   :target: https://github.com/nthparty/lhe/actions/workflows/lint-test-cover-docs.yml
   :alt: GitHub Actions status.

.. |coveralls| image:: https://coveralls.io/repos/github/nthparty/lhe/badge.svg?branch=main
   :target: https://coveralls.io/github/nthparty/lhe?branch=main
   :alt: Coveralls test coverage summary.

Installation and Usage
----------------------
This library is available as a `package on PyPI <https://pypi.org/project/lhe>`__::

    python -m pip install lhe

The library can be imported in the usual way::

    from lhe import *

.. |lhe| replace:: ``lhe``
.. _lhe: https://lhe.readthedocs.io/en/latest/_source/lhe.html#lhe.lhe.lhe


The library exports everything needed to perform level-4 homomorphic encryption:

.. code-block:: python

    >>> from lhe import keygen, encrypt, decrypt
    
    # A secret key is given to recipient and its corresponding public key is given to contrubutors.
    >>> sk, pk = keygen()
    
    # Contributors encrypt their data using that very same public key they have recieved.
    >>> ct1 = encrypt(pk, 1)
    >>> ct2 = encrypt(pk, 2)
    >>> ct3 = encrypt(pk, 96)
    >>> ct4 = encrypt(pk, 200)
    
    # Compute party operates on those contributed ciphertexts.
    >>> ct5 = (ct1 + ct2) * (ct3 + ct4)
    
    # The recipient of the computation decrypts the resulting ciphertext of the computation. 
    >>> pt = decrypt(sk, ct5)
    
    # Assuming the result is not too large of a number, it is resolved exactly.
    >>> int(pt)
    888

.. code-block:: python

    >>> from lhe.advanced import *
    >>> sk1, pk1 = keygen1()
    >>> sk2, pk2 = keygen2()
    >>>
    >>> ct1 = encrypt1(pk1, 3)
    >>> ct2 = encrypt2(pk2, 222)
    >>>
    >>> ct3 = multiply(ct1, ct2)
    >>>
    >>> print("This may take a bit of time for large plaintexts...")
    This may take a bit of time for large plaintexts...
    >>>
    >>> pt = decryptGT(ct3, sk1, sk2)
    >>>
    >>> print(pt)
    666




Development
-----------
All installation and development dependencies are managed using `setuptools <https://pypi.org/project/setuptools>`__ and are fully specified in ``setup.py``. The ``extras_require`` parameter is used to `specify optional requirements <https://setuptools.pypa.io/en/latest/userguide/dependency_management.html#optional-dependencies>`__ for various development tasks. This makes it possible to specify additional options (such as ``docs``, ``lint``, and so on) when performing installation using `pip <https://pypi.org/project/pip>`__::

    python -m pip install .[docs,lint]

Documentation
^^^^^^^^^^^^^
The documentation can be generated automatically from the source files using `Sphinx <https://www.sphinx-doc.org>`__::

    python -m pip install .[docs]
    cd docs
    sphinx-apidoc -f -E --templatedir=_templates -o _source .. ../setup.py && make html

Testing and Conventions
^^^^^^^^^^^^^^^^^^^^^^^
All unit tests are executed and their coverage is measured when using `pytest <https://docs.pytest.org>`__ (see ``setup.cfg`` for configuration details)::

    python -m pip install .[test]
    python -m pytest

Alternatively, all unit tests are included in the module itself and can be executed using `doctest <https://docs.python.org/3/library/doctest.html>`__::

    python lhe/lhe.py -v

Style conventions are enforced using `Pylint <https://www.pylint.org>`__::

    python -m pip install .[lint]
    python -m pylint lhe

Contributions
^^^^^^^^^^^^^
In order to contribute to the source code, open an issue or submit a pull request on the `GitHub page <https://github.com/nthparty/lhe>`__ for this library.

Versioning
^^^^^^^^^^
Beginning with version 0.1.0, the version number format for this library and the changes to the library associated with version number increments conform with `Semantic Versioning 2.0.0 <https://semver.org/#semantic-versioning-200>`__.

Publishing
^^^^^^^^^^
This library can be published as a `package on PyPI <https://pypi.org/project/lhe>`__ by a package maintainer. First, install the dependencies required for packaging and publishing::

    python -m pip install .[publish]

Remove any old build/distribution files. Then, package the source into a distribution archive using the `wheel <https://pypi.org/project/wheel>`__ package::

    rm -rf dist *.egg-info
    python setup.py clean
    python setup.py sdist bdist_wheel

Finally, increment the version and upload the package distribution archive to `PyPI <https://pypi.org>`__ using the `twine <https://pypi.org/project/twine>`__ package::

    python -m twine upload dist/*