From 4e86fcb581c621de3ce7bb5f0c4d39303f0885b6 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Mon, 16 Dec 2024 17:27:17 +0100 Subject: [PATCH] deserialization of signatures and identifiers --- codexvalidator/basics.nim | 2 ++ codexvalidator/signatures.nim | 2 ++ codexvalidator/signatures/deserialization.nim | 18 +++++++++++++++ tests/codexvalidator/basics.nim | 10 ++++++--- tests/codexvalidator/examples.nim | 6 +++++ tests/codexvalidator/testSignatures.nim | 22 +++++++++++++++++++ 6 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 codexvalidator/signatures/deserialization.nim diff --git a/codexvalidator/basics.nim b/codexvalidator/basics.nim index fe8adad..674299e 100644 --- a/codexvalidator/basics.nim +++ b/codexvalidator/basics.nim @@ -1,7 +1,9 @@ import std/sequtils import pkg/stint import pkg/questionable +import pkg/questionable/results export sequtils export stint export questionable +export results diff --git a/codexvalidator/signatures.nim b/codexvalidator/signatures.nim index c8d637f..53313bf 100644 --- a/codexvalidator/signatures.nim +++ b/codexvalidator/signatures.nim @@ -2,8 +2,10 @@ import ./signatures/identity import ./signatures/signing import ./signatures/signed import ./signatures/serialization +import ./signatures/deserialization export identity export signing export signed export serialization +export deserialization diff --git a/codexvalidator/signatures/deserialization.nim b/codexvalidator/signatures/deserialization.nim new file mode 100644 index 0000000..07c82d4 --- /dev/null +++ b/codexvalidator/signatures/deserialization.nim @@ -0,0 +1,18 @@ +import pkg/blscurve +import ../basics +import ./identity +import ./signing + +func fromBytes*(_: type Identifier, bytes: openArray[byte]): ?!Identifier = + var identifier: Identifier + if blscurve.fromBytes(identifier, bytes): + success identifier + else: + failure "invalid identifier" + +func fromBytes*(_: type Signature, bytes: openArray[byte]): ?!Signature = + var signature: Signature + if blscurve.fromBytes(signature, bytes): + success signature + else: + failure "invalid signature" diff --git a/tests/codexvalidator/basics.nim b/tests/codexvalidator/basics.nim index f8e4c5b..38dcb09 100644 --- a/tests/codexvalidator/basics.nim +++ b/tests/codexvalidator/basics.nim @@ -1,11 +1,15 @@ import std/unittest import std/sequtils -import pkg/stint - export unittest export sequtils + +import pkg/stint export stint -import ./examples +import pkg/questionable +import pkg/questionable/results +export questionable +export results +import ./examples export examples diff --git a/tests/codexvalidator/examples.nim b/tests/codexvalidator/examples.nim index 498bb1e..b5949f3 100644 --- a/tests/codexvalidator/examples.nim +++ b/tests/codexvalidator/examples.nim @@ -74,6 +74,12 @@ proc example*(_: type Transaction): Transaction = proc example*(_: type Identity): Identity = Identity.random(result) +proc example*(_: type Identifier): Identifier = + Identity.example.identifier + +proc example*(_: type Signature): Signature = + Identity.example.sign(seq[byte].example) + proc example*(_: type CommitteeMember): CommitteeMember = CommitteeMember(uint32.example.int) diff --git a/tests/codexvalidator/testSignatures.nim b/tests/codexvalidator/testSignatures.nim index 1489bfc..730df27 100644 --- a/tests/codexvalidator/testSignatures.nim +++ b/tests/codexvalidator/testSignatures.nim @@ -49,3 +49,25 @@ suite "Signature scheme": let hash = Hash.example let signature = identity.sign(hash) check signature.verify(identity.identifier, hash) + + test "identifier can be serialized and deserialized": + let identifier = Identifier.example + let serialized = identifier.toBytes() + check Identifier.fromBytes(serialized) == success identifier + + test "identifier deserialization fails when wrong number of bytes": + let identifier = Identifier.example + let serialized = identifier.toBytes() + let invalid = serialized & 42'u8 + check isFailure Identifier.fromBytes(invalid) + + test "signature can be serialized and deserialized": + let signature = Signature.example + let serialized = signature.toBytes() + check Signature.fromBytes(serialized) == success signature + + test "signature deserialization fails when wrong number of bytes": + let signature = Signature.example + let serialized = signature.toBytes() + let invalid = serialized & 42'u8 + check isFailure Signature.fromBytes(invalid)