Compare commits

...

31 Commits

Author SHA1 Message Date
Luke Murphy 3b22aef4b6
Fix up README example
continuous-integration/drone/push Build is passing Details
2020-08-05 08:31:12 +02:00
Luke Murphy b3f6204808
Small case it
[ci skip]
2020-07-07 15:56:31 +02:00
Luke Murphy 44f290af50
Fix noqa ref and drop erroneous flags for isort
continuous-integration/drone/push Build is passing Details
2020-07-07 15:53:58 +02:00
Luke Murphy fe1bda9817
Remove reference to missing file
continuous-integration/drone/push Build is failing Details
2020-07-07 15:38:34 +02:00
Luke Murphy 6285212209
Put noqa in the right place 2020-07-07 15:37:34 +02:00
Luke Murphy f06335126b
Add missing lock file 2020-07-07 15:33:28 +02:00
Luke Murphy db5f71d240
Migrate to pyproject config
continuous-integration/drone/push Build is failing Details
2020-07-07 15:31:53 +02:00
Luke Murphy 53ce07f1c4
Try to install libsodium
continuous-integration/drone/push Build is passing Details
2020-06-30 02:08:31 +02:00
Luke Murphy 86ba86206c
Add new release logs and drone file
continuous-integration/drone/push Build is failing Details
2020-05-16 18:40:02 +02:00
Luke Murphy 7245256c84
Add badge 2020-05-16 18:38:51 +02:00
Luke Murphy f49769b3c8
Follow Hypercore protocol and reduce boilerplate 2020-05-16 18:38:29 +02:00
Luke Murphy e8ed3bdf21
Fix link 2020-02-22 17:13:49 +01:00
Luke Murphy 95e05b5f7b
Fix organisation name 2020-02-22 14:38:00 +01:00
Luke Murphy 8f0afd7780
Fix mocker usage 2019-12-04 22:50:05 +07:00
Luke Murphy 284e0ff66b
Also configure RTD to use new docs path 2019-11-26 10:40:43 +07:00
Luke Murphy 4062168814
Use more standard docs folder 2019-11-25 11:20:53 +07:00
Luke Murphy f7a5fd0e2a
Add github funding file 2019-11-20 09:58:45 +07:00
Luke Murphy 2db86a5237
Add liberapay link 2019-11-20 09:49:52 +07:00
Luke Murphy 02163fab81
Add new change log entry 2019-11-14 19:11:50 +07:00
Luke Murphy 60a0ff1920
Fix keyword argument
Closes https://github.com/datpy/hypercore-crypto/issues/3.
2019-11-14 19:09:19 +07:00
Luke Murphy 2f73f08030
Fix RTD 2019-11-03 20:13:47 +01:00
Luke Murphy 303b8c0fc7
Fix docs build 2019-11-03 18:20:50 +01:00
Luke Murphy 9cf8b7946a
Fix Datpy wording 2019-11-03 16:55:39 +01:00
Luke Murphy 9321539803
New Sphinx theme and better docs 2019-11-03 16:48:32 +01:00
Luke Murphy 4254c262fe
Add funding file 2019-10-09 00:48:03 +02:00
Luke Murphy 690adc0ab8
Fix license badge 2019-10-08 23:58:14 +02:00
Luke Murphy 39b3bdf8b7
Add export list 2019-10-06 16:19:18 +02:00
Luke Murphy 2c50616ab8
Add example and fix links 2019-10-06 16:19:11 +02:00
Luke Murphy 980a1e8218
Use right license to match original 2019-10-06 16:18:58 +02:00
Luke Murphy c579de3af9
Simplify contrib docs 2019-10-06 16:18:50 +02:00
Luke Murphy ed47ad09d8
Inline all the tox definitions 2019-10-06 15:14:09 +02:00
33 changed files with 493 additions and 550 deletions

25
.drone.yml Normal file
View File

@ -0,0 +1,25 @@
---
matrix:
include:
- IMAGE: 3.6-stretch
TOXENV: py36
- IMAGE: 3.7-stretch
TOXENV: py37
- IMAGE: 3.8-buster
TOXENV: py38
- IMAGE: 3.8-buster
TOXENV: lint
- IMAGE: 3.8-buster
TOXENV: sort
- IMAGE: 3.8-buster
TOXENV: format
- IMAGE: 3.8-buster
TOXENV: type
pipeline:
build:
image: python:${IMAGE}
commands:
- apt update && apt install -y libsodium-dev
- pip install tox
- tox -e ${TOXENV}

1
.gitignore vendored
View File

@ -9,4 +9,3 @@ __pycache__
build/
dist/
pip-wheel-metadata/
documentation/build/

View File

@ -1,8 +0,0 @@
version: 2
build:
image: latest
sphinx:
configuration: documentation/source/conf.py
fail_on_warning: true

View File

@ -1,31 +0,0 @@
language: python
addons:
apt:
packages:
- libsodium-dev
matrix:
include:
- python: 3.6
env: TOXENV=py36
- python: 3.7
env: TOXENV=py37
- python: 3.7
env: TOXENV=lint
- python: 3.7
env: TOXENV=sort
- python: 3.7
env: TOXENV=format
- python: 3.7
env: TOXENV=type
- python: 3.7
env: TOXENV=docs
- python: 3.7
env: TOXENV=metadata-release
install:
- pip install tox==3.13.2
script:
- tox -v

23
CHANGELOG.md Normal file
View File

@ -0,0 +1,23 @@
# hypercore-crypto 0.0.1a5 (UNRELEASED)
# hypercore-crypto 0.0.1a4 (2020-07-07)
- Migration configurations to pyproject
- Follow the Hypercore protocol renaming situation.
- Migrate CI to drone.autonomic.zone
- Migrate to git.autonomic.zone
- Reduce package boilerplate
- Removed RTD documentation
# hypercore-crypto 0.0.1a3 (2019-11-14)
- Use the correct keyword argument when invoking `crypto_generichash`.
# hypercore-crypto 0.0.1a2 (2019-11-03)
- Add a changelog.
- New Sphinx theme.
# hypercore-crypto 0.0.1a1 (2019-10-05)
- The first alpha development release is made!

View File

View File

@ -1,111 +0,0 @@
Introduction
------------
The DatPy community is committed to providing an inclusive, safe, and
collaborative environment for all participants, regardless of their gender,
gender expression, race, ethnicity, religion, sexual orientation, sexual
characteristics, physical appearance, disability, or age. We encourage every
participant to be themselves, and must respect the rights of others. The code
of conduct is a set of guidelines that establishes shared values and ensures
that behaviors that may harm participants are avoided.
The values of the DatPy community are focused on developing both our individual
and collective potential, supporting and empowering the most marginalized,
mutual respect, and an anti-violence approach that favors support and
collaboration among participants and the resolution of conflicts. A code of
conduct helps us co-exist in a more positive way and provides individuals who
are victims of negative behaviors with confidence that they will be supported
by the organization and the DatPy community, who respects and stands behind the
code of conduct.
The DatPy community works towards providing a welcoming environment where
participants are treated with dignity and respect and are free to be
themselves. We encourage all participants to approach the Librehosters network
with an open and positive attitude, engaging constructively with others at all
times.
Respect for Diversity & Inclusion
---------------------------------
We avoid comments, actions or propaganda that encourage discrimination related
to gender, gender expression, race, ethnicity, religion, sexual orientation,
sexual characteristics, physical appearance, disability, or age.
Respect Freedom of Expression
-----------------------------
We support an individual's freedom of expression, and will not make fun of
accents or make unsolicited grammatical corrections. We will strive to better
understand each other by not assuming experiences or beliefs, clarifying
meanings, and making an effort to speak clearly, avoiding jargon and acronyms.
Commitment to Non-Violence
--------------------------
We will not engage in any type of violence or aggression, including verbal
threats or complaints, intimidation, stalking or harassment, whether physically
or psychologically.
Rejection of Sexual Harassment
------------------------------
We understand sexual harassment as unwanted physical contact or insinuation of
a sexual nature, as well as displaying images, drawings or visual
representations of any kind that objectify members of any gender or reinforce
oppression. The only exception is if this is part of a session, workshop and/or
educational experience where showing these images is educational in nature.
Respect for Privacy
-------------------
We safeguard the privacy of the participants. This includes refraining from
posting or publishing information about attendees (including names and
affiliation) unless given clear permission, and avoid any type of unauthorized
video, audio recording, or photography.
Facilitate Participation & Collaboration
----------------------------------------
We work to create an environment that facilitates participation for all
participants. We will not engage in sustained disruption of discussions or
events, interrupt conversations in a way that negatively impacts collaboration,
or engage in toxic behaviours to attract negative attention to a participant.
We Care about the Integrity and Health of the Community
-------------------------------------------------------
We value the health of the community and will not engage in behaviour that can
negatively impact it. This includes contaminating food or drink with drugs, or
inciting or insisting on the consumption of alcohol, psychoactive substances,
etc.
Support Positive Interactions Among Participants
------------------------------------------------
We are committed to engaging constructively with others at all times. We will
not tolerate bullying, including requesting or mobilizing others, either in
person or online, to bully others.
Enforcement
-----------
Overseeing the code of conduct
==============================
The DatPy community, composed of volunteers, oversees the
code of conduct, including addressing all incident reports. Breaking the code
of conduct may result in immediate expulsion from the Librehosters network.
How to Report an Incident
=========================
If you witness an incident or are the victim of one:
1. You can reach out directly via email at lukewm@riseup.net.
Acknowledgements
----------------
This code of conduct is inspired by the [IFF CoC].
[IFF CoC]: https://www.internetfreedomfestival.org/wiki/index.php/Code_of_Conduct

View File

@ -1,45 +0,0 @@
Get started
-----------
Install `Tox`_ with:
.. _tox: http://tox.readthedocs.io/
.. code-block:: bash
$ pip install --user tox
Run tests
---------
.. code-block:: bash
tox -e py37
Lint source
-----------
.. code-block:: bash
tox -e lint
Format source
-------------
.. code-block:: bash
tox -e format
Type check source
-----------------
.. code-block:: bash
tox -e type
Release Process
---------------
.. code-block:: bash
$ tox -e release

View File

@ -1 +0,0 @@
include LICENSE README.rst CHANGELOG.rst

30
README.md Normal file
View File

@ -0,0 +1,30 @@
# hypercore-crypto
[![Build Status](https://drone.autonomic.zone/api/badges/hyperpy/hypercore-crypto/status.svg)](https://drone.autonomic.zone/hyperpy/hypercore-crypto)
## Cryptography primitives for Hypercore
## Install
```sh
$ pip install hypercore-crypto
```
## Example
```python
from pysodium import crypto_sign_PUBLICKEYBYTES
from hypercore_crypto import data, key_pair
public_key, secret_key = key_pair()
assert len(public_key) == crypto_sign_PUBLICKEYBYTES
print(data(b"hello world").hex())
```
Output:
```sh
ccfa4259ee7c41e411e5770973a49c5ceffb5272d6a37f2c6f2dac2190f7e2b7
```

View File

@ -1,47 +0,0 @@
.. _header:
****************
hypercore-crypto
****************
.. image:: https://img.shields.io/badge/license-GPL-brightgreen.svg
:target: LICENSE
:alt: Repository license
.. image:: https://badge.fury.io/py/hypercore-crypto.svg
:target: https://badge.fury.io/py/hypercore-crypto
:alt: PyPI package
.. image:: https://travis-ci.com/datpy/hypercore-crypto.svg?branch=master
:target: https://travis-ci.com/datpy/hypercore-crypto
:alt: Travis CI result
.. image:: https://readthedocs.org/projects/hypercore-crypto/badge/?version=latest
:target: https://hypercore-crypto.readthedocs.io/en/latest/
:alt: Documentation status
.. image:: https://img.shields.io/badge/support-maintainers-brightgreen.svg
:target: https://decentral1.se
:alt: Support badge
.. _introduction:
Cryptography primitives for Hypercore
-------------------------------------
Cryptography primitives for `Hypercore`_ (WIP).
.. _Hypercore: https://hypercore.readthedocs.io/en/latest/
.. _documentation:
Documentation
*************
* https://hypercore-crypto.readthedocs.io/
Mirroring
*********
* https://hack.decentral1.se/datpy/hypercore-crypto (primary)
* https://github.com/datpy/hypercore-crypto

View File

@ -1,12 +0,0 @@
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SOURCEDIR = source
BUILDDIR = build
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

View File

@ -1,5 +0,0 @@
*********
Changelog
*********
.. include:: ../../CHANGELOG.rst

View File

@ -1,6 +0,0 @@
.. _code-of-conduct:
Code of Conduct
***************
.. include:: ../../CODE_OF_CONDUCT.rst

View File

@ -1,9 +0,0 @@
author = 'decentral1se'
copyright = '2019, decentral1se'
html_static_path = ['_static']
html_theme = 'alabaster'
master_doc = 'index'
project = 'hypercore-crypto'
templates_path = ['_templates']
extensions = ['sphinx.ext.autodoc', 'sphinx_autodoc_typehints']
autodoc_mock_imports = ['pysodium'] # no libsodium in the RTD environment

View File

@ -1,5 +0,0 @@
**********
Contribute
**********
.. include:: ../../CONTRIBUTING.rst

View File

@ -1,14 +0,0 @@
.. include:: ../../README.rst
:end-before: _documentation
Table of Contents
*****************
.. toctree::
install
modules-api
other-impls
contribute
changelog
code-of-conduct

View File

@ -1,11 +0,0 @@
************
Installation
************
.. code-block:: bash
$ pip install hypercore-crypto
.. note::
This tool only supports Python >= 3.6.

View File

@ -1,8 +0,0 @@
.. _modules_api:
***********
Modules API
***********
.. automodule:: hypercore_crypto.crypto
:members:

View File

@ -1,7 +0,0 @@
.. _other-implementations:
Other Implementations
*********************
* https://github.com/mafintosh/hypercore-crypto
* https://github.com/datcxx/hypercore-crypto

View File

@ -11,14 +11,3 @@ from hypercore_crypto.crypto import ( # noqa
tree,
verify,
)
try:
import pkg_resources
except ImportError:
pass
try:
__version__ = pkg_resources.get_distribution('hypercore_crypto').version
except Exception:
__version__ = 'unknown'

View File

@ -15,11 +15,23 @@ from pysodium import (
randombytes,
)
__all__ = [
"key_pair",
"sign",
"verify",
"data",
"leaf",
"parent",
"tree",
"random_bytes",
"discovery_key",
]
# https://en.wikipedia.org/wiki/Merkle_tree#Second_preimage_attack
LEAF_TYPE = bytes([0])
PARENT_TYPE = bytes([1])
ROOT_TYPE = bytes([2])
HYPERCORE = bytes('hypercore', encoding='utf-8')
HYPERCORE = bytes("hypercore", encoding="utf-8")
def key_pair(seed: Optional[bytes] = None) -> Tuple[bytes, bytes]:
@ -78,7 +90,7 @@ def leaf(leaf: MerkleTreeNode) -> bytes:
def parent(child: MerkleTreeNode, parent: MerkleTreeNode) -> bytes:
if child.index > parent.index:
raise ValueError('Child index is greater than parent?')
raise ValueError("Child index is greater than parent?")
values = [
PARENT_TYPE,
@ -119,7 +131,7 @@ def discovery_key(public_key: bytes) -> bytes:
:param public_key: The public key for hashing
"""
return crypto_generichash(HYPERCORE, key=public_key)
return crypto_generichash(HYPERCORE, k=public_key)
def _to_unsigned_64_int(num: int) -> bytes:
@ -129,7 +141,7 @@ def _to_unsigned_64_int(num: int) -> bytes:
:param num: The integer to be converted
"""
return int(num).to_bytes(8, byteorder='big', signed=False)
return int(num).to_bytes(8, byteorder="big", signed=False)
def _blake2bify(data: Sequence[bytes]) -> bytes:

View File

@ -1,4 +0,0 @@
[mypy]
python_version = 3.7
platform = linux
ignore_missing_imports = True

313
poetry.lock generated Normal file
View File

@ -0,0 +1,313 @@
[[package]]
category = "dev"
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
name = "appdirs"
optional = false
python-versions = "*"
version = "1.4.4"
[[package]]
category = "main"
description = "Classes Without Boilerplate"
name = "attrs"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "19.3.0"
[package.extras]
azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"]
dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"]
docs = ["sphinx", "zope.interface"]
tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
[[package]]
category = "dev"
description = "The uncompromising code formatter."
name = "black"
optional = false
python-versions = ">=3.6"
version = "19.10b0"
[package.dependencies]
appdirs = "*"
attrs = ">=18.1.0"
click = ">=6.5"
pathspec = ">=0.6,<1"
regex = "*"
toml = ">=0.9.4"
typed-ast = ">=1.4.0"
[package.extras]
d = ["aiohttp (>=3.3.2)", "aiohttp-cors"]
[[package]]
category = "dev"
description = "Composable command line interface toolkit"
name = "click"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "7.1.2"
[[package]]
category = "dev"
description = "the modular source code checker: pep8 pyflakes and co"
name = "flake8"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
version = "3.8.3"
[package.dependencies]
mccabe = ">=0.6.0,<0.7.0"
pycodestyle = ">=2.6.0a1,<2.7.0"
pyflakes = ">=2.2.0,<2.3.0"
[package.dependencies.importlib-metadata]
python = "<3.8"
version = "*"
[[package]]
category = "main"
description = "Utilities for navigating flat trees"
name = "flat-tree"
optional = false
python-versions = ">=3.6,<4.0"
version = "0.0.1a8"
[package.dependencies]
attrs = ">=19.3.0,<20.0.0"
[[package]]
category = "dev"
description = "Read metadata from Python packages"
marker = "python_version < \"3.8\""
name = "importlib-metadata"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
version = "1.7.0"
[package.dependencies]
zipp = ">=0.5"
[package.extras]
docs = ["sphinx", "rst.linker"]
testing = ["packaging", "pep517", "importlib-resources (>=1.3)"]
[[package]]
category = "dev"
description = "A Python utility / library to sort Python imports."
name = "isort"
optional = false
python-versions = ">=3.6,<4.0"
version = "5.0.4"
[package.extras]
pipfile_deprecated_finder = ["pipreqs", "requirementslib", "tomlkit (>=0.5.3)"]
requirements_deprecated_finder = ["pipreqs", "pip-api"]
[[package]]
category = "dev"
description = "McCabe checker, plugin for flake8"
name = "mccabe"
optional = false
python-versions = "*"
version = "0.6.1"
[[package]]
category = "main"
description = "A stream that generates a merkle tree based on the incoming data."
name = "merkle-tree-stream"
optional = false
python-versions = ">=3.6"
version = "0.0.1a4"
[package.dependencies]
attrs = ">=19.1.0,<20.0"
flat-tree = ">=0.0.1a3,<1.0"
[package.extras]
changelog = ["towncrier (<=19.2.0)"]
docs = ["sphinx", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.6.0,<2.0)"]
[[package]]
category = "dev"
description = "Utility library for gitignore style pattern matching of file paths."
name = "pathspec"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "0.8.0"
[[package]]
category = "dev"
description = "Python style guide checker"
name = "pycodestyle"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.6.0"
[[package]]
category = "dev"
description = "passive checker of Python programs"
name = "pyflakes"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.2.0"
[[package]]
category = "main"
description = "python libsodium wrapper"
name = "pysodium"
optional = false
python-versions = "*"
version = "0.7.5"
[[package]]
category = "dev"
description = "Alternative regular expression module, to replace re."
name = "regex"
optional = false
python-versions = "*"
version = "2020.6.8"
[[package]]
category = "dev"
description = "Python Library for Tom's Obvious, Minimal Language"
name = "toml"
optional = false
python-versions = "*"
version = "0.10.1"
[[package]]
category = "dev"
description = "a fork of Python 2 and 3 ast modules with type comment support"
name = "typed-ast"
optional = false
python-versions = "*"
version = "1.4.1"
[[package]]
category = "dev"
description = "Backport of pathlib-compatible object wrapper for zip files"
marker = "python_version < \"3.8\""
name = "zipp"
optional = false
python-versions = ">=3.6"
version = "3.1.0"
[package.extras]
docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
testing = ["jaraco.itertools", "func-timeout"]
[metadata]
content-hash = "b411ea52bb2bd359e7da40e6c3d8bff5e2d720c4b47d42918c1a1f5305051b43"
python-versions = "^3.6"
[metadata.files]
appdirs = [
{file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
{file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
]
attrs = [
{file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"},
{file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"},
]
black = [
{file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"},
{file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"},
]
click = [
{file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
{file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
]
flake8 = [
{file = "flake8-3.8.3-py2.py3-none-any.whl", hash = "sha256:15e351d19611c887e482fb960eae4d44845013cc142d42896e9862f775d8cf5c"},
{file = "flake8-3.8.3.tar.gz", hash = "sha256:f04b9fcbac03b0a3e58c0ab3a0ecc462e023a9faf046d57794184028123aa208"},
]
flat-tree = [
{file = "flat-tree-0.0.1a8.tar.gz", hash = "sha256:c6fe90ec5dcd5ac353c04440bbe8d19631258b04297a6464fbd7a425e2c9c80a"},
{file = "flat_tree-0.0.1a8-py3-none-any.whl", hash = "sha256:03ecedf09f47a668f83e6a8c6b396045063323756baa604aeff2ff2a32245ee0"},
]
importlib-metadata = [
{file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"},
{file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"},
]
isort = [
{file = "isort-5.0.4-py3-none-any.whl", hash = "sha256:78661ad751751cb3c181d37302e175a0c644b3714877c073df058c596281d7fd"},
{file = "isort-5.0.4.tar.gz", hash = "sha256:6ae9cf5414e416954e3421f861cbbfc099b3ace63cb270cc76c6670efd960a0a"},
]
mccabe = [
{file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
]
merkle-tree-stream = [
{file = "merkle-tree-stream-0.0.1a4.tar.gz", hash = "sha256:9e9d5e06e006f00c60fc8c5fd875cc28d74e04e6b8c5c9e4c3098fb1da0bfd0e"},
]
pathspec = [
{file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"},
{file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"},
]
pycodestyle = [
{file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"},
{file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"},
]
pyflakes = [
{file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"},
{file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"},
]
pysodium = [
{file = "pysodium-0.7.5.linux-x86_64.tar.gz", hash = "sha256:1ebcd98d1680b13f947f7aedb5fb9dd59f7295611b6023fb8516ef0e31dc6a8c"},
{file = "pysodium-0.7.5.tar.gz", hash = "sha256:d70810792cc945a76bd5aa8726a49df272168acc814eb39613e7c29c47df8c6e"},
]
regex = [
{file = "regex-2020.6.8-cp27-cp27m-win32.whl", hash = "sha256:fbff901c54c22425a5b809b914a3bfaf4b9570eee0e5ce8186ac71eb2025191c"},
{file = "regex-2020.6.8-cp27-cp27m-win_amd64.whl", hash = "sha256:112e34adf95e45158c597feea65d06a8124898bdeac975c9087fe71b572bd938"},
{file = "regex-2020.6.8-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:92d8a043a4241a710c1cf7593f5577fbb832cf6c3a00ff3fc1ff2052aff5dd89"},
{file = "regex-2020.6.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bae83f2a56ab30d5353b47f9b2a33e4aac4de9401fb582b55c42b132a8ac3868"},
{file = "regex-2020.6.8-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b2ba0f78b3ef375114856cbdaa30559914d081c416b431f2437f83ce4f8b7f2f"},
{file = "regex-2020.6.8-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:95fa7726d073c87141f7bbfb04c284901f8328e2d430eeb71b8ffdd5742a5ded"},
{file = "regex-2020.6.8-cp36-cp36m-win32.whl", hash = "sha256:e3cdc9423808f7e1bb9c2e0bdb1c9dc37b0607b30d646ff6faf0d4e41ee8fee3"},
{file = "regex-2020.6.8-cp36-cp36m-win_amd64.whl", hash = "sha256:c78e66a922de1c95a208e4ec02e2e5cf0bb83a36ceececc10a72841e53fbf2bd"},
{file = "regex-2020.6.8-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:08997a37b221a3e27d68ffb601e45abfb0093d39ee770e4257bd2f5115e8cb0a"},
{file = "regex-2020.6.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2f6f211633ee8d3f7706953e9d3edc7ce63a1d6aad0be5dcee1ece127eea13ae"},
{file = "regex-2020.6.8-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:55b4c25cbb3b29f8d5e63aeed27b49fa0f8476b0d4e1b3171d85db891938cc3a"},
{file = "regex-2020.6.8-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:89cda1a5d3e33ec9e231ece7307afc101b5217523d55ef4dc7fb2abd6de71ba3"},
{file = "regex-2020.6.8-cp37-cp37m-win32.whl", hash = "sha256:690f858d9a94d903cf5cada62ce069b5d93b313d7d05456dbcd99420856562d9"},
{file = "regex-2020.6.8-cp37-cp37m-win_amd64.whl", hash = "sha256:1700419d8a18c26ff396b3b06ace315b5f2a6e780dad387e4c48717a12a22c29"},
{file = "regex-2020.6.8-cp38-cp38-manylinux1_i686.whl", hash = "sha256:654cb773b2792e50151f0e22be0f2b6e1c3a04c5328ff1d9d59c0398d37ef610"},
{file = "regex-2020.6.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:52e1b4bef02f4040b2fd547357a170fc1146e60ab310cdbdd098db86e929b387"},
{file = "regex-2020.6.8-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:cf59bbf282b627130f5ba68b7fa3abdb96372b24b66bdf72a4920e8153fc7910"},
{file = "regex-2020.6.8-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5aaa5928b039ae440d775acea11d01e42ff26e1561c0ffcd3d805750973c6baf"},
{file = "regex-2020.6.8-cp38-cp38-win32.whl", hash = "sha256:97712e0d0af05febd8ab63d2ef0ab2d0cd9deddf4476f7aa153f76feef4b2754"},
{file = "regex-2020.6.8-cp38-cp38-win_amd64.whl", hash = "sha256:6ad8663c17db4c5ef438141f99e291c4d4edfeaacc0ce28b5bba2b0bf273d9b5"},
{file = "regex-2020.6.8.tar.gz", hash = "sha256:e9b64e609d37438f7d6e68c2546d2cb8062f3adb27e6336bc129b51be20773ac"},
]
toml = [
{file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"},
{file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"},
]
typed-ast = [
{file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"},
{file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"},
{file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"},
{file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"},
{file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"},
{file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"},
{file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"},
{file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"},
{file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"},
{file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"},
{file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"},
{file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"},
{file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"},
{file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"},
{file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"},
{file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"},
{file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"},
{file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"},
{file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"},
{file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"},
{file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"},
]
zipp = [
{file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"},
{file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"},
]

View File

@ -1,54 +1,77 @@
[build-system]
requires = [
'setuptools>=40.9.0',
'setuptools-scm',
'wheel',
]
build-backend = 'setuptools.build_meta'
requires = ["poetry>=1.0.9,<2.0"]
build-backend = "poetry.masonry.api"
[tool.poetry]
name = "hypercore-crypto"
version = "0.0.1a4"
description = "Cryptography primitives for Hypercore"
authors = ["decentral1se <hi@decentral1.se>"]
maintainers = ["decentral1se <hi@decentral1.se>"]
license = "GPLv3"
readme = "README.md"
repository = "https://github.com/hyperpy/hypercore-crypto"
keywords = ["hypercore", "hypercore-protocol"]
[tool.poetry.dependencies]
python = "^3.6"
pysodium = "^0.7.5"
merkle-tree-stream = "^0.0.1-alpha.4"
[tool.poetry.dev-dependencies]
black = "^19.10b0"
flake8 = "^3.8.3"
isort = "^5.0.2"
[tool.black]
line-length = 80
target-version = ['py36', 'py37']
skip-string-normalization = true
target-version = ["py38"]
include = '\.pyi?$'
[tool.towncrier]
directory = 'changelog/'
filename = 'CHANGELOG.rst'
package = 'hypercore-crypto'
package_dir = 'hypercore-crypto'
[tool.isort]
include_trailing_comma = true
known_first_party = "hypercore_crypto"
known_third_party = "pytest"
line_length = 80
multi_line_output = 3
skip = ".venv,.tox"
[[tool.towncrier.type]]
directory = 'removal'
name = 'Removals'
showcontent = true
[tool.tox]
legacy_tox_ini = """
[tox]
envlist =
{py36,py37,py38}
lint
sort
format
type
skip_missing_interpreters = True
isolated_build = True
[[tool.towncrier.type]]
directory = 'deprecation'
name = 'Deprecations'
showcontent = true
[testenv]
deps =
pytest
pytest-cov
pytest-mock
commands = pytest test/ --cov={toxinidir}/hypercore_crypto/ --no-cov-on-fail {posargs}
[[tool.towncrier.type]]
directory = 'feature'
name = 'Features'
showcontent = true
[testenv:lint]
skipdist = True
deps = flake8
commands = flake8 {posargs:--max-line-length 80} hypercore_crypto/ test/
[[tool.towncrier.type]]
directory = 'bugfix'
name = 'Bug Fixes'
showcontent = true
[testenv:sort]
skipdist = True
deps = isort
commands = isort {posargs:-c} hypercore_crypto/ test/
[[tool.towncrier.type]]
directory = 'doc'
name = 'Improved Documentation'
showcontent = true
[testenv:format]
skipdist = True
deps = black
commands = black {posargs:--check} hypercore_crypto/ test/
[[tool.towncrier.type]]
directory = 'trivial'
name = 'Trivial/Internal Changes'
showcontent = true
[[tool.towncrier.type]]
directory = 'announce'
name = 'Project announcements'
showcontent = true
[testenv:type]
skipdist = True
deps = mypy
commands = mypy {posargs:--ignore-missing-imports} hypercore_crypto/ test/
"""

View File

@ -1,63 +0,0 @@
[tool:pytest]
testpaths = test
[flake8]
max-line-length = 80
[isort]
known_first_party = hypercore-crypto
known_third_party = pytest
line_length = 80
multi_line_output = 3
skip = .venv, .tox
include_trailing_comma = True
[metadata]
name = hypercore-crypto
author = decentral1se
author_email = lukewm@riseup.net
maintainer = decentral1se
maintainer_email = lukewm@riseup.net
url = https://hack.decentral1.se/datpy/hypercore-crypto
project_urls =
Source Code = https://hack.decentral1.se/datpy/hypercore-crypto
Documentation = https://hypercore-crypto.readthedocs.io/
Maintainer Support = https://decentral1.se
description = Cryptography primitives for Hypercore
long_description = file: README.rst
license = GPLv3
license_file = LICENSE
classifiers =
Programming Language :: Python :: 3
Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7
[options]
use_scm_version = True
python_requires = >=3.6
setup_requires =
setuptools_scm
setuptools_scm_git_archive
package_dir =
= .
packages = find:
zip_safe = False
install_requires =
pysodium >= 0.7.2, < 0.8
merkle-tree-stream >= 0.0.1a1, < 1.0.0
[options.packages.find]
where = .
[build_sphinx]
all_files = 1
build-dir = documentation/build
source-dir = documentation/source
warning-is-error = True
[options.extras_require]
docs =
sphinx
sphinx-autodoc-typehints >= 1.6.0, < 2.0
changelog =
towncrier <= 19.2.0, < 20.0

View File

@ -1,3 +0,0 @@
from setuptools import setup
setup(use_scm_version=True)

View File

@ -4,13 +4,21 @@ import pytest
from merkle_tree_stream import MerkleTreeNode
from pysodium import crypto_sign_PUBLICKEYBYTES, crypto_sign_SECRETKEYBYTES
from hypercore_crypto import data, key_pair, parent, random_bytes, sign, verify
from hypercore_crypto import (
data,
discovery_key,
key_pair,
parent,
random_bytes,
sign,
verify,
)
def test_key_pair_seed_length():
with pytest.raises(ValueError) as exception:
key_pair(b'world hello')
assert 'must be of length' in str(exception)
key_pair(b"world hello")
assert "must be of length" in str(exception)
def test_key_pair_length():
@ -20,7 +28,7 @@ def test_key_pair_length():
def test_sign():
message = b'hello world'
message = b"hello world"
_, secret_key = key_pair()
signature = sign(message, secret_key)
assert message not in signature
@ -28,7 +36,7 @@ def test_sign():
def test_verify():
message = b'hello world'
message = b"hello world"
public_key, secret_key = key_pair()
signature = sign(message, secret_key)
assert verify(message, signature, public_key)
@ -36,8 +44,8 @@ def test_verify():
def test_data_digest():
assert (
data(b'hello world').hex()
== 'ccfa4259ee7c41e411e5770973a49c5ceffb5272d6a37f2c6f2dac2190f7e2b7'
data(b"hello world").hex()
== "ccfa4259ee7c41e411e5770973a49c5ceffb5272d6a37f2c6f2dac2190f7e2b7"
)
@ -46,7 +54,7 @@ def test_random_bytes():
def test_parent_digest():
_data = b'hello world'
_data = b"hello world"
_parent = parent(
MerkleTreeNode(
index=0, size=11, hash=data(_data), parent=None, data=None
@ -57,5 +65,9 @@ def test_parent_digest():
)
assert (
_parent.hex()
== '43563406adba8b34b133fdca32d0a458c5be769615e01df30e6535ccd3c075f0'
== "43563406adba8b34b133fdca32d0a458c5be769615e01df30e6535ccd3c075f0"
)
def test_discovery_key_generated():
assert discovery_key(random_bytes(32)) is not None

View File

@ -1,9 +0,0 @@
"""Version test module."""
def test_version_fails_gracefully(mocker):
target = 'pkg_resources.get_distribution'
with mocker.patch(target, side_effect=Exception()):
from hypercore_crypto.__init__ import __version__
assert __version__ == 'unknown'

84
tox.ini
View File

@ -1,84 +0,0 @@
[tox]
envlist =
{py36,py37}
lint
sort
format
type
docs
changelog
metadata-release
skip_missing_interpreters = True
isolated_build = True
[testenv]
description = run the unit tests
deps =
pytest
pytest-cov
pytest-mock
commands =
pytest test/ --cov={toxinidir}/hypercore_crypto/ --no-cov-on-fail {posargs}
[testenv:lint]
description = lint the source
skipdist = True
deps =
flake8
commands =
flake8 {posargs} hypercore_crypto/ test/
[testenv:sort]
description = sort the source
skipdist = True
deps =
isort
commands =
isort {posargs:-rc -c} -sp setup.cfg hypercore_crypto/ test/
[testenv:format]
description = format the source
skipdist = True
basepython = python3.7
deps =
black
commands =
black {posargs:--check} hypercore_crypto/ test/
[testenv:type]
description = type check the source
basepython = python3.7
skipdist = True
deps =
mypy
commands =
mypy hypercore_crypto/ test/
[testenv:docs]
description = build the documentation
skipdist = True
extras = docs
commands =
python -m setup build_sphinx
[testenv:changelog]
description = draft the changelog
skipdist = True
extras = changelog
commands =
towncrier --draft
[testenv:metadata-release]
description = validate the package metadata
deps =
twine
commands =
twine check .tox/dist/*
[testenv:release]
description = make a release
deps =
{[testenv:metadata-release]deps}
commands =
python -m setup sdist bdist_wheel
twine upload {toxworkdir}/dist/*