Move from ed25519 to PyNaCl
This commit is contained in:
parent
280652d5a7
commit
1299acd463
@ -4,7 +4,9 @@ import re
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
import bip39
|
import bip39
|
||||||
from ed25519 import BadSignatureError, SigningKey, VerifyingKey, create_keypair
|
from nacl.encoding import RawEncoder
|
||||||
|
from nacl.exceptions import BadSignatureError
|
||||||
|
from nacl.signing import SigningKey, VerifyKey
|
||||||
|
|
||||||
from .base32 import base32_bytes_to_string, base32_string_to_bytes
|
from .base32 import base32_bytes_to_string, base32_string_to_bytes
|
||||||
from .exc import ValidationError
|
from .exc import ValidationError
|
||||||
@ -29,21 +31,17 @@ class Identity:
|
|||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
name: str,
|
name: str,
|
||||||
verify_key: Optional[VerifyingKey] = None,
|
verify_key: Optional[VerifyKey] = None,
|
||||||
sign_key: Optional[SigningKey] = None,
|
sign_key: Optional[SigningKey] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
if not self.valid_name(name):
|
if not self.valid_name(name):
|
||||||
raise ValidationError(f'Invalid name: {name}')
|
raise ValidationError(f'Invalid name: {name}')
|
||||||
|
|
||||||
if (
|
if sign_key and verify_key and sign_key.verify_key != verify_key:
|
||||||
sign_key
|
|
||||||
and verify_key
|
|
||||||
and sign_key.get_verifying_key().to_bytes() != verify_key.to_bytes()
|
|
||||||
):
|
|
||||||
raise ValidationError('Signing and verifying keys don’t match')
|
raise ValidationError('Signing and verifying keys don’t match')
|
||||||
|
|
||||||
if sign_key and not verify_key:
|
if sign_key and not verify_key:
|
||||||
verify_key = sign_key.get_verifying_key()
|
verify_key = sign_key.verify_key
|
||||||
|
|
||||||
if not verify_key:
|
if not verify_key:
|
||||||
raise ValidationError('At least verify_key must be present')
|
raise ValidationError('At least verify_key must be present')
|
||||||
@ -53,7 +51,9 @@ class Identity:
|
|||||||
self.sign_key = sign_key
|
self.sign_key = sign_key
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return f'@{self.name}.{base32_bytes_to_string(self.verify_key.to_bytes())}'
|
key = base32_bytes_to_string(self.verify_key.encode(RawEncoder))
|
||||||
|
|
||||||
|
return f'@{self.name}.{key}'
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
if self.sign_key:
|
if self.sign_key:
|
||||||
@ -81,9 +81,8 @@ class Identity:
|
|||||||
|
|
||||||
address = address[1:]
|
address = address[1:]
|
||||||
name, verify_key_data = address.split('.')
|
name, verify_key_data = address.split('.')
|
||||||
|
|
||||||
verify_key_bytes = base32_string_to_bytes(verify_key_data)
|
verify_key_bytes = base32_string_to_bytes(verify_key_data)
|
||||||
verify_key = VerifyingKey(verify_key_bytes)
|
verify_key = VerifyKey(verify_key_bytes)
|
||||||
|
|
||||||
return cls(name, verify_key=verify_key)
|
return cls(name, verify_key=verify_key)
|
||||||
|
|
||||||
@ -109,7 +108,7 @@ class Identity:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
verify_key_bytes = base32_string_to_bytes(verify_key_data)
|
verify_key_bytes = base32_string_to_bytes(verify_key_data)
|
||||||
VerifyingKey(verify_key_bytes)
|
VerifyKey(verify_key_bytes)
|
||||||
except BaseException: # pylint: disable=broad-except
|
except BaseException: # pylint: disable=broad-except
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -119,7 +118,8 @@ class Identity:
|
|||||||
def generate(cls, name: str) -> 'Identity':
|
def generate(cls, name: str) -> 'Identity':
|
||||||
"""Generate a new entity"""
|
"""Generate a new entity"""
|
||||||
|
|
||||||
sign_key, verify_key = create_keypair()
|
sign_key = SigningKey.generate()
|
||||||
|
verify_key = sign_key.verify_key
|
||||||
|
|
||||||
return cls(name, verify_key=verify_key, sign_key=sign_key)
|
return cls(name, verify_key=verify_key, sign_key=sign_key)
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ class Identity:
|
|||||||
if self.sign_key is None:
|
if self.sign_key is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
seed = self.sign_key.to_seed()
|
seed = self.sign_key.encode()
|
||||||
mnemonic = bip39.encode_bytes(seed)
|
mnemonic = bip39.encode_bytes(seed)
|
||||||
|
|
||||||
return f'{self.name} {mnemonic}'
|
return f'{self.name} {mnemonic}'
|
||||||
@ -153,7 +153,9 @@ class Identity:
|
|||||||
if not self.sign_key:
|
if not self.sign_key:
|
||||||
raise TypeError('This identity doesn’t have a signing key')
|
raise TypeError('This identity doesn’t have a signing key')
|
||||||
|
|
||||||
return base32_bytes_to_string(self.sign_key.sign(data.encode('utf-8')))
|
signed_message = self.sign_key.sign(data.encode('utf-8'))
|
||||||
|
|
||||||
|
return base32_bytes_to_string(signed_message.signature)
|
||||||
|
|
||||||
def verify(self, data: str, signature: str) -> bool:
|
def verify(self, data: str, signature: str) -> bool:
|
||||||
"""Verify if data is signed by us"""
|
"""Verify if data is signed by us"""
|
||||||
@ -161,7 +163,7 @@ class Identity:
|
|||||||
signature_bytes = base32_string_to_bytes(signature)
|
signature_bytes = base32_string_to_bytes(signature)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.verify_key.verify(signature_bytes, data.encode('utf-8'))
|
self.verify_key.verify(data.encode('utf-8'), signature_bytes)
|
||||||
except BadSignatureError:
|
except BadSignatureError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
from .keys import (
|
|
||||||
BadSignatureError,
|
|
||||||
BadPrefixError,
|
|
||||||
create_keypair,
|
|
||||||
SigningKey,
|
|
||||||
VerifyingKey,
|
|
||||||
remove_prefix,
|
|
||||||
to_ascii,
|
|
||||||
from_ascii,
|
|
||||||
)
|
|
||||||
|
|
||||||
__all__ = (
|
|
||||||
'BadSignatureError',
|
|
||||||
'BadPrefixError',
|
|
||||||
'create_keypair',
|
|
||||||
'SigningKey',
|
|
||||||
'VerifyingKey',
|
|
||||||
'remove_prefix',
|
|
||||||
'to_ascii',
|
|
||||||
'from_ascii',
|
|
||||||
'__version__'
|
|
||||||
)
|
|
@ -1,3 +0,0 @@
|
|||||||
version_json: str
|
|
||||||
|
|
||||||
def get_versions(): ...
|
|
@ -1,32 +0,0 @@
|
|||||||
from typing import Any, Callable, Optional, Tuple
|
|
||||||
|
|
||||||
BadSignatureError: Any
|
|
||||||
|
|
||||||
def create_keypair(entropy: Callable[[int], bytes] = ...) -> Tuple[SigningKey, VerifyingKey]: ...
|
|
||||||
|
|
||||||
class BadPrefixError(Exception): ...
|
|
||||||
|
|
||||||
def remove_prefix(s_bytes: bytes, prefix: bytes) -> bytes: ...
|
|
||||||
def to_ascii(s_bytes: bytes, prefix: str = ..., encoding: str = ...) -> str: ...
|
|
||||||
def from_ascii(s_ascii: str, prefix: str = ..., encoding: str = ...) -> bytes: ...
|
|
||||||
|
|
||||||
class SigningKey:
|
|
||||||
sk_s: bytes
|
|
||||||
vk_s: bytes
|
|
||||||
def __init__(self, sk_s: bytes, prefix: str = ..., encoding: Optional[str] = ...) -> None: ...
|
|
||||||
def to_bytes(self, prefix: str = ...) -> bytes: ...
|
|
||||||
def to_ascii(self, prefix: str = ..., encoding: Optional[str] = ...) -> str: ...
|
|
||||||
def to_seed(self, prefix: str = ...) -> bytes: ...
|
|
||||||
def __eq__(self, them: object) -> bool: ...
|
|
||||||
def get_verifying_key(self) -> VerifyingKey: ...
|
|
||||||
def sign(self, msg: bytes, prefix: str = ..., encoding: Optional[str] = ...) -> bytes: ...
|
|
||||||
|
|
||||||
class VerifyingKey:
|
|
||||||
vk_s: bytes
|
|
||||||
def __init__(self, vk_s: bytes, prefix: str = ..., encoding: Optional[str] = ...) -> None: ...
|
|
||||||
def to_bytes(self, prefix: str = ...) -> bytes: ...
|
|
||||||
def to_ascii(self, prefix: str = ..., encoding: Optional[str] = ...) -> str: ...
|
|
||||||
def __eq__(self, them: object) -> bool: ...
|
|
||||||
def verify(self, sig: bytes, msg: bytes, prefix: str = ..., encoding: Optional[str] = ...) -> bool: ...
|
|
||||||
|
|
||||||
def selftest() -> None: ...
|
|
115
poetry.lock
generated
115
poetry.lock
generated
@ -64,6 +64,17 @@ d = ["aiohttp (>=3.7.4)"]
|
|||||||
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
|
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
|
||||||
uvloop = ["uvloop (>=0.15.2)"]
|
uvloop = ["uvloop (>=0.15.2)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cffi"
|
||||||
|
version = "1.15.0"
|
||||||
|
description = "Foreign Function Interface for Python calling C code."
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
pycparser = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "click"
|
name = "click"
|
||||||
version = "8.1.2"
|
version = "8.1.2"
|
||||||
@ -108,14 +119,6 @@ python-versions = ">=2.7, !=3.0.*"
|
|||||||
[package.extras]
|
[package.extras]
|
||||||
graph = ["objgraph (>=1.7.2)"]
|
graph = ["objgraph (>=1.7.2)"]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ed25519"
|
|
||||||
version = "1.5"
|
|
||||||
description = "Ed25519 public-key signatures"
|
|
||||||
category = "main"
|
|
||||||
optional = false
|
|
||||||
python-versions = "*"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fastjsonschema"
|
name = "fastjsonschema"
|
||||||
version = "2.15.3"
|
version = "2.15.3"
|
||||||
@ -241,6 +244,14 @@ category = "dev"
|
|||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pycparser"
|
||||||
|
version = "2.21"
|
||||||
|
description = "C parser in Python"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pylint"
|
name = "pylint"
|
||||||
version = "2.13.5"
|
version = "2.13.5"
|
||||||
@ -261,6 +272,21 @@ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
|
|||||||
[package.extras]
|
[package.extras]
|
||||||
testutil = ["gitpython (>3)"]
|
testutil = ["gitpython (>3)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pynacl"
|
||||||
|
version = "1.5.0"
|
||||||
|
description = "Python binding to the Networking and Cryptography (NaCl) library"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
cffi = ">=1.4.1"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"]
|
||||||
|
tests = ["pytest (>=3.2.1,!=3.3.0)", "hypothesis (>=3.27.0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyparsing"
|
name = "pyparsing"
|
||||||
version = "3.0.8"
|
version = "3.0.8"
|
||||||
@ -349,7 +375,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.10"
|
python-versions = "^3.10"
|
||||||
content-hash = "97d56a47bf36410214965fb0aa60352f05af7eb2e2d0b51f1919a42e05f677df"
|
content-hash = "9d4e957c25769c1ade80ea509b8228362a5c6e69a16b9b48adb94d09c3dd896a"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
astroid = [
|
astroid = [
|
||||||
@ -393,6 +419,58 @@ black = [
|
|||||||
{file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"},
|
{file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"},
|
||||||
{file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"},
|
{file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"},
|
||||||
]
|
]
|
||||||
|
cffi = [
|
||||||
|
{file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"},
|
||||||
|
{file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"},
|
||||||
|
{file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"},
|
||||||
|
{file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"},
|
||||||
|
{file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"},
|
||||||
|
{file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"},
|
||||||
|
{file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"},
|
||||||
|
{file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"},
|
||||||
|
{file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"},
|
||||||
|
{file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"},
|
||||||
|
{file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"},
|
||||||
|
{file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"},
|
||||||
|
{file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"},
|
||||||
|
{file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"},
|
||||||
|
{file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"},
|
||||||
|
{file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"},
|
||||||
|
{file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"},
|
||||||
|
{file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"},
|
||||||
|
{file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"},
|
||||||
|
{file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"},
|
||||||
|
{file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"},
|
||||||
|
{file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"},
|
||||||
|
{file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"},
|
||||||
|
{file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"},
|
||||||
|
{file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"},
|
||||||
|
{file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"},
|
||||||
|
{file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"},
|
||||||
|
{file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"},
|
||||||
|
{file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"},
|
||||||
|
{file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"},
|
||||||
|
{file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"},
|
||||||
|
{file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"},
|
||||||
|
{file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"},
|
||||||
|
{file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"},
|
||||||
|
{file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"},
|
||||||
|
{file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"},
|
||||||
|
{file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"},
|
||||||
|
{file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"},
|
||||||
|
{file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"},
|
||||||
|
{file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"},
|
||||||
|
{file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"},
|
||||||
|
{file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"},
|
||||||
|
{file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"},
|
||||||
|
{file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"},
|
||||||
|
{file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"},
|
||||||
|
{file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"},
|
||||||
|
{file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"},
|
||||||
|
{file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"},
|
||||||
|
{file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"},
|
||||||
|
{file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"},
|
||||||
|
]
|
||||||
click = [
|
click = [
|
||||||
{file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"},
|
{file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"},
|
||||||
{file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"},
|
{file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"},
|
||||||
@ -448,9 +526,6 @@ dill = [
|
|||||||
{file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"},
|
{file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"},
|
||||||
{file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"},
|
{file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"},
|
||||||
]
|
]
|
||||||
ed25519 = [
|
|
||||||
{file = "ed25519-1.5.tar.gz", hash = "sha256:02053ee019ceef0df97294be2d4d5a8fc120fc86e81e08bec1245fc0f9403358"},
|
|
||||||
]
|
|
||||||
fastjsonschema = [
|
fastjsonschema = [
|
||||||
{file = "fastjsonschema-2.15.3-py3-none-any.whl", hash = "sha256:ddb0b1d8243e6e3abb822bd14e447a89f4ab7439342912d590444831fa00b6a0"},
|
{file = "fastjsonschema-2.15.3-py3-none-any.whl", hash = "sha256:ddb0b1d8243e6e3abb822bd14e447a89f4ab7439342912d590444831fa00b6a0"},
|
||||||
{file = "fastjsonschema-2.15.3.tar.gz", hash = "sha256:0a572f0836962d844c1fc435e200b2e4f4677e4e6611a2e3bdd01ba697c275ec"},
|
{file = "fastjsonschema-2.15.3.tar.gz", hash = "sha256:0a572f0836962d844c1fc435e200b2e4f4677e4e6611a2e3bdd01ba697c275ec"},
|
||||||
@ -555,10 +630,26 @@ py = [
|
|||||||
{file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
|
{file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
|
||||||
{file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
|
{file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
|
||||||
]
|
]
|
||||||
|
pycparser = [
|
||||||
|
{file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
|
||||||
|
{file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
|
||||||
|
]
|
||||||
pylint = [
|
pylint = [
|
||||||
{file = "pylint-2.13.5-py3-none-any.whl", hash = "sha256:c149694cfdeaee1aa2465e6eaab84c87a881a7d55e6e93e09466be7164764d1e"},
|
{file = "pylint-2.13.5-py3-none-any.whl", hash = "sha256:c149694cfdeaee1aa2465e6eaab84c87a881a7d55e6e93e09466be7164764d1e"},
|
||||||
{file = "pylint-2.13.5.tar.gz", hash = "sha256:dab221658368c7a05242e673c275c488670144123f4bd262b2777249c1c0de9b"},
|
{file = "pylint-2.13.5.tar.gz", hash = "sha256:dab221658368c7a05242e673c275c488670144123f4bd262b2777249c1c0de9b"},
|
||||||
]
|
]
|
||||||
|
pynacl = [
|
||||||
|
{file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"},
|
||||||
|
{file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"},
|
||||||
|
{file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"},
|
||||||
|
{file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"},
|
||||||
|
{file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"},
|
||||||
|
{file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"},
|
||||||
|
{file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"},
|
||||||
|
{file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"},
|
||||||
|
{file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"},
|
||||||
|
{file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"},
|
||||||
|
]
|
||||||
pyparsing = [
|
pyparsing = [
|
||||||
{file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"},
|
{file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"},
|
||||||
{file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"},
|
{file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"},
|
||||||
|
@ -6,9 +6,9 @@ authors = ["Gergely Polonkai <gergely@polonkai.eu>"]
|
|||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.10"
|
python = "^3.10"
|
||||||
ed25519 = "^1.5"
|
|
||||||
bip39 = "^0.0.2"
|
bip39 = "^0.0.2"
|
||||||
fastjsonschema = "^2.15.3"
|
fastjsonschema = "^2.15.3"
|
||||||
|
PyNaCl = "^1.5.0"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
pytest = "^7.1.1"
|
pytest = "^7.1.1"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"""Test configuration and global fixtures
|
"""Test configuration and global fixtures
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from ed25519 import SigningKey
|
from nacl.signing import SigningKey
|
||||||
import pytest
|
import pytest
|
||||||
from _pytest.fixtures import SubRequest
|
from _pytest.fixtures import SubRequest
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
|
|
||||||
from ed25519 import SigningKey
|
from nacl.signing import SigningKey
|
||||||
import pytest
|
import pytest
|
||||||
from pytest_mock.plugin import MockerFixture
|
from pytest_mock.plugin import MockerFixture
|
||||||
|
|
||||||
@ -213,11 +213,11 @@ def test_sign_different_author(identity: Identity) -> None:
|
|||||||
def test_sign_new_identity() -> None:
|
def test_sign_new_identity() -> None:
|
||||||
"""Test if signing a document with a different entity also sets the author"""
|
"""Test if signing a document with a different entity also sets the author"""
|
||||||
|
|
||||||
key_seed = (
|
other_key_seed = (
|
||||||
b'`_\x8dm\x18\xeem\xe3\\\xeb_\x1aw)\xcd\xb7\xd8\xd9\xdd\xad\x86\x9a#wQ"F\x95\xa1\x178r'
|
b'`_\x8dm\x18\xeem\xe3\\\xeb_\x1aw)\xcd\xb7\xd8\xd9\xdd\xad\x86\x9a#wQ"F\x95\xa1\x178r'
|
||||||
)
|
)
|
||||||
key = SigningKey(key_seed)
|
identity = Identity('name', sign_key=SigningKey(other_key_seed))
|
||||||
identity = Identity('name', sign_key=key)
|
assert str(identity) == '@name.bu5seaewd4p7cx7ot4ue3m6wpigfa5hmowxgeophe2so72roao5wq'
|
||||||
|
|
||||||
document = Es4Document.from_json(VALID_DOCUMENT)
|
document = Es4Document.from_json(VALID_DOCUMENT)
|
||||||
document.author = identity
|
document.author = identity
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import bip39
|
import bip39
|
||||||
from ed25519 import SigningKey, create_keypair
|
from nacl.signing import SigningKey
|
||||||
import pytest
|
import pytest
|
||||||
from pytest_mock.plugin import MockerFixture
|
from pytest_mock.plugin import MockerFixture
|
||||||
|
|
||||||
@ -27,7 +27,8 @@ TEST_MNEMONIC = bip39.encode_bytes(TEST_SEED)
|
|||||||
def test_init_bad_name(name: str) -> None:
|
def test_init_bad_name(name: str) -> None:
|
||||||
"""Test if initialisation is not possible with an invalid name"""
|
"""Test if initialisation is not possible with an invalid name"""
|
||||||
|
|
||||||
sign, verify = create_keypair()
|
sign = SigningKey.generate()
|
||||||
|
verify = sign.verify_key
|
||||||
|
|
||||||
with pytest.raises(ValidationError) as ctx:
|
with pytest.raises(ValidationError) as ctx:
|
||||||
Identity(name, verify_key=verify, sign_key=sign)
|
Identity(name, verify_key=verify, sign_key=sign)
|
||||||
@ -38,8 +39,8 @@ def test_init_bad_name(name: str) -> None:
|
|||||||
def test_init_key_mismatch() -> None:
|
def test_init_key_mismatch() -> None:
|
||||||
"""Test if initialisation fails if the signing and verifying keys don’t match"""
|
"""Test if initialisation fails if the signing and verifying keys don’t match"""
|
||||||
|
|
||||||
sign1, _ = create_keypair()
|
sign1 = SigningKey.generate()
|
||||||
_, verify2 = create_keypair()
|
verify2 = SigningKey.generate().verify_key
|
||||||
|
|
||||||
with pytest.raises(ValidationError) as ctx:
|
with pytest.raises(ValidationError) as ctx:
|
||||||
Identity('name', verify_key=verify2, sign_key=sign1)
|
Identity('name', verify_key=verify2, sign_key=sign1)
|
||||||
@ -89,12 +90,12 @@ def test_from_address() -> None:
|
|||||||
"""Test loading an identity from an author address"""
|
"""Test loading an identity from an author address"""
|
||||||
|
|
||||||
skey = SigningKey(TEST_SEED)
|
skey = SigningKey(TEST_SEED)
|
||||||
vkey = skey.get_verifying_key()
|
vkey = skey.verify_key
|
||||||
identity = Identity.from_address('@test.bcz76z52y5dlpohtkmpuj3jsdcvfmebzpcgfmtmhu4u7hlexzreya')
|
identity = Identity.from_address('@test.bcz76z52y5dlpohtkmpuj3jsdcvfmebzpcgfmtmhu4u7hlexzreya')
|
||||||
|
|
||||||
assert identity.name == 'test'
|
assert identity.name == 'test'
|
||||||
assert identity.sign_key is None
|
assert identity.sign_key is None
|
||||||
assert identity.verify_key.to_bytes() == vkey.to_bytes()
|
assert identity.verify_key == vkey
|
||||||
|
|
||||||
|
|
||||||
def test_from_invalid_address() -> None:
|
def test_from_invalid_address() -> None:
|
||||||
@ -110,9 +111,8 @@ def test_generate(mocker: MockerFixture) -> None:
|
|||||||
"""Test the generate property"""
|
"""Test the generate property"""
|
||||||
|
|
||||||
skey = SigningKey(TEST_SEED)
|
skey = SigningKey(TEST_SEED)
|
||||||
vkey = skey.get_verifying_key()
|
|
||||||
|
|
||||||
mocker.patch('earthsnake.identity.create_keypair', return_value=(skey, vkey))
|
mocker.patch('earthsnake.identity.SigningKey.generate', return_value=skey)
|
||||||
identity = Identity.generate('test')
|
identity = Identity.generate('test')
|
||||||
|
|
||||||
assert str(identity) == '@test.bcz76z52y5dlpohtkmpuj3jsdcvfmebzpcgfmtmhu4u7hlexzreya'
|
assert str(identity) == '@test.bcz76z52y5dlpohtkmpuj3jsdcvfmebzpcgfmtmhu4u7hlexzreya'
|
||||||
@ -145,7 +145,7 @@ def test_from_mnemonic() -> None:
|
|||||||
|
|
||||||
assert identity.name == name
|
assert identity.name == name
|
||||||
assert identity.sign_key
|
assert identity.sign_key
|
||||||
assert identity.sign_key.to_seed() == TEST_SEED
|
assert identity.sign_key.encode() == TEST_SEED
|
||||||
assert str(identity) == f'@{name}.bcz76z52y5dlpohtkmpuj3jsdcvfmebzpcgfmtmhu4u7hlexzreya'
|
assert str(identity) == f'@{name}.bcz76z52y5dlpohtkmpuj3jsdcvfmebzpcgfmtmhu4u7hlexzreya'
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user