Refactor ID to not use third-party type for cryptographic keys
Remove `ID.from_privkey` which would require specific knowledge per cryptosystem
This commit is contained in:
parent
cff5fe0d5f
commit
bd8d45fbc1
|
@ -28,9 +28,8 @@ async def cleanup_done_tasks():
|
||||||
|
|
||||||
|
|
||||||
def generate_id():
|
def generate_id():
|
||||||
new_key = RSA.generate(2048, e=65537)
|
new_key = RSA.generate(2048, e=65537).publickey().export_key("DER")
|
||||||
new_id = ID.from_pubkey(new_key.publickey())
|
new_id = ID.from_pubkey(new_key)
|
||||||
# private_key = new_key.exportKey("PEM")
|
|
||||||
return new_id
|
return new_id
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,16 +5,6 @@ import base58
|
||||||
|
|
||||||
import multihash
|
import multihash
|
||||||
|
|
||||||
from Crypto.PublicKey.RSA import RsaKey
|
|
||||||
|
|
||||||
# MaxInlineKeyLength is the maximum length a key can be for it to be inlined in
|
|
||||||
# the peer ID.
|
|
||||||
# * When `len(pubKey.Bytes()) <= MaxInlineKeyLength`, the peer ID is the
|
|
||||||
# identity multihash hash of the public key.
|
|
||||||
# * When `len(pubKey.Bytes()) > MaxInlineKeyLength`, the peer ID is the
|
|
||||||
# sha2-256 multihash of the public key.
|
|
||||||
MAX_INLINE_KEY_LENGTH = 42
|
|
||||||
|
|
||||||
|
|
||||||
class ID:
|
class ID:
|
||||||
|
|
||||||
|
@ -64,22 +54,11 @@ class ID:
|
||||||
return pid
|
return pid
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_pubkey(cls, key: RsaKey) -> "ID":
|
def from_pubkey(cls, key: bytes) -> "ID":
|
||||||
# export into binary format
|
algo = multihash.Func.sha2_256
|
||||||
key_bin = key.exportKey("DER")
|
mh_digest = multihash.digest(key, algo)
|
||||||
|
|
||||||
algo: int = multihash.Func.sha2_256
|
|
||||||
# TODO: seems identity is not yet supported in pymultihash
|
|
||||||
# if len(b) <= MAX_INLINE_KEY_LENGTH:
|
|
||||||
# algo multihash.func.identity
|
|
||||||
|
|
||||||
mh_digest: multihash.Multihash = multihash.digest(key_bin, algo)
|
|
||||||
return cls(mh_digest.encode())
|
return cls(mh_digest.encode())
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_privkey(cls, key: RsaKey) -> "ID":
|
|
||||||
return cls.from_pubkey(key.publickey())
|
|
||||||
|
|
||||||
|
|
||||||
def digest(data: Union[str, bytes]) -> bytes:
|
def digest(data: Union[str, bytes]) -> bytes:
|
||||||
if isinstance(data, str):
|
if isinstance(data, str):
|
||||||
|
|
|
@ -111,13 +111,6 @@ def test_id_from_public_key():
|
||||||
algo = multihash.Func.sha2_256
|
algo = multihash.Func.sha2_256
|
||||||
mh_digest = multihash.digest(key_bin, algo)
|
mh_digest = multihash.digest(key_bin, algo)
|
||||||
expected = ID(mh_digest.encode())
|
expected = ID(mh_digest.encode())
|
||||||
actual = ID.from_pubkey(key)
|
actual = ID.from_pubkey(key_bin)
|
||||||
|
|
||||||
assert actual == expected
|
assert actual == expected
|
||||||
|
|
||||||
|
|
||||||
def test_id_from_private_key():
|
|
||||||
key = RSA.generate(2048, e=65537)
|
|
||||||
id_from_pub = ID.from_pubkey(key.publickey())
|
|
||||||
id_from_priv = ID.from_privkey(key)
|
|
||||||
assert id_from_pub == id_from_priv
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user