mirror of
https://github.com/fluencelabs/crypto
synced 2025-04-24 22:32:17 +00:00
Sign merkle root part2 (#100)
* client send signed versnio+merkleRoot * fix b-tree-client js compilation * change SignatureVerifier method notation add publish client signature from node * fix test * make integration test green again * fix test * fix test * move contract validation from 'Codec' to 'ContractValidate' * improve MerkleBTreeClientSpec * little changes * move 'contract-core' tests from 'jvm' area` to crossplatform area * review * review
This commit is contained in:
parent
672a40763a
commit
69d3eb50c1
@ -20,6 +20,7 @@ package fluence.crypto
|
|||||||
import cats.data.EitherT
|
import cats.data.EitherT
|
||||||
import cats.instances.try_._
|
import cats.instances.try_._
|
||||||
import fluence.crypto.algorithm.{CryptoErr, Ecdsa}
|
import fluence.crypto.algorithm.{CryptoErr, Ecdsa}
|
||||||
|
import fluence.crypto.keypair.KeyPair
|
||||||
import org.scalatest.{Matchers, WordSpec}
|
import org.scalatest.{Matchers, WordSpec}
|
||||||
import scodec.bits.ByteVector
|
import scodec.bits.ByteVector
|
||||||
|
|
||||||
@ -64,27 +65,30 @@ class EcdsaSpec extends WordSpec with Matchers {
|
|||||||
val algo = Ecdsa.signAlgo
|
val algo = Ecdsa.signAlgo
|
||||||
val keys = algo.generateKeyPair().extract
|
val keys = algo.generateKeyPair().extract
|
||||||
val signer = algo.signer(keys)
|
val signer = algo.signer(keys)
|
||||||
|
val checker = algo.checker(keys.publicKey)
|
||||||
|
|
||||||
val data = rndByteVector(10)
|
val data = rndByteVector(10)
|
||||||
val sign = signer.sign(data).extract
|
val sign = signer.sign(data).extract
|
||||||
|
|
||||||
algo.checker.check(sign, data).isOk shouldBe true
|
checker.check(sign.sign, data).isOk shouldBe true
|
||||||
|
|
||||||
val randomSign = signer.sign(rndByteVector(10)).extract
|
val randomSign = signer.sign(rndByteVector(10)).extract
|
||||||
algo.checker.check(randomSign, data).isOk shouldBe false
|
checker.check(randomSign.sign, data).isOk shouldBe false
|
||||||
}
|
}
|
||||||
|
|
||||||
"throw an errors on invalid data" in {
|
"throw an errors on invalid data" in {
|
||||||
val algo = Ecdsa.signAlgo
|
val algo = Ecdsa.signAlgo
|
||||||
val keys = algo.generateKeyPair().extract
|
val keys = algo.generateKeyPair().extract
|
||||||
val signer = algo.signer(keys)
|
val signer = algo.signer(keys)
|
||||||
|
val checker = algo.checker(keys.publicKey)
|
||||||
val data = rndByteVector(10)
|
val data = rndByteVector(10)
|
||||||
|
|
||||||
val sign = signer.sign(data).extract
|
val sign = signer.sign(data).extract
|
||||||
|
|
||||||
the[CryptoErr] thrownBy algo.checker.check(sign.copy(sign = rndByteVector(10)), data).value.flatMap(_.toTry).get
|
the[CryptoErr] thrownBy checker.check(rndByteVector(10), data).value.flatMap(_.toTry).get
|
||||||
the[CryptoErr] thrownBy algo.checker
|
val invalidChecker = algo.checker(KeyPair.fromByteVectors(rndByteVector(10), rndByteVector(10)).publicKey)
|
||||||
.check(sign.copy(publicKey = sign.publicKey.copy(value = rndByteVector(10))), data)
|
the[CryptoErr] thrownBy invalidChecker
|
||||||
|
.check(sign.sign, data)
|
||||||
.value
|
.value
|
||||||
.flatMap(_.toTry)
|
.flatMap(_.toTry)
|
||||||
.get
|
.get
|
||||||
|
@ -22,6 +22,7 @@ import java.io.File
|
|||||||
import cats.data.EitherT
|
import cats.data.EitherT
|
||||||
import cats.instances.try_._
|
import cats.instances.try_._
|
||||||
import fluence.crypto.algorithm.{CryptoErr, Ecdsa}
|
import fluence.crypto.algorithm.{CryptoErr, Ecdsa}
|
||||||
|
import fluence.crypto.keypair.KeyPair
|
||||||
import org.scalatest.{Matchers, WordSpec}
|
import org.scalatest.{Matchers, WordSpec}
|
||||||
import scodec.bits.ByteVector
|
import scodec.bits.ByteVector
|
||||||
|
|
||||||
@ -66,30 +67,33 @@ class SignatureSpec extends WordSpec with Matchers {
|
|||||||
val algo = Ecdsa.signAlgo
|
val algo = Ecdsa.signAlgo
|
||||||
val keys = algo.generateKeyPair().extract
|
val keys = algo.generateKeyPair().extract
|
||||||
val signer = algo.signer(keys)
|
val signer = algo.signer(keys)
|
||||||
|
val checker = algo.checker(keys.publicKey)
|
||||||
|
|
||||||
val data = rndByteVector(10)
|
val data = rndByteVector(10)
|
||||||
val sign = signer.sign(data).extract
|
val sign = signer.sign(data).extract.sign
|
||||||
|
|
||||||
algo.checker.check(sign, data).isOk shouldBe true
|
checker.check(sign, data).isOk shouldBe true
|
||||||
|
|
||||||
val randomSign = signer.sign(rndByteVector(10)).extract
|
val randomSign = signer.sign(rndByteVector(10)).extract.sign
|
||||||
algo.checker.check(randomSign, data).isOk shouldBe false
|
checker.check(randomSign, data).isOk shouldBe false
|
||||||
}
|
}
|
||||||
|
|
||||||
"throw an errors on invalid data" in {
|
"throw an errors on invalid data" in {
|
||||||
val algo = Ecdsa.signAlgo
|
val algo = Ecdsa.signAlgo
|
||||||
val keys = algo.generateKeyPair().extract
|
val keys = algo.generateKeyPair().extract
|
||||||
val signer = algo.signer(keys)
|
val signer = algo.signer(keys)
|
||||||
|
val checker = algo.checker(keys.publicKey)
|
||||||
val data = rndByteVector(10)
|
val data = rndByteVector(10)
|
||||||
|
|
||||||
val sign = signer.sign(data).extract
|
val sign = signer.sign(data).extract.sign
|
||||||
|
|
||||||
the[CryptoErr] thrownBy {
|
the[CryptoErr] thrownBy {
|
||||||
algo.checker.check(sign.copy(sign = rndByteVector(10)), data).value.flatMap(_.toTry).get
|
checker.check(rndByteVector(10), data).value.flatMap(_.toTry).get
|
||||||
}
|
}
|
||||||
|
val invalidChecker = algo.checker(KeyPair.fromByteVectors(rndByteVector(10), rndByteVector(10)).publicKey)
|
||||||
the[CryptoErr] thrownBy {
|
the[CryptoErr] thrownBy {
|
||||||
algo.checker
|
invalidChecker
|
||||||
.check(sign.copy(publicKey = sign.publicKey.copy(value = rndByteVector(10))), data)
|
.check(sign, data)
|
||||||
.value
|
.value
|
||||||
.flatMap(_.toTry)
|
.flatMap(_.toTry)
|
||||||
.get
|
.get
|
||||||
@ -111,10 +115,10 @@ class SignatureSpec extends WordSpec with Matchers {
|
|||||||
|
|
||||||
val signer = algo.signer(keys)
|
val signer = algo.signer(keys)
|
||||||
val data = rndByteVector(10)
|
val data = rndByteVector(10)
|
||||||
val sign = signer.sign(data).extract
|
val sign = signer.sign(data).extract.sign
|
||||||
|
|
||||||
algo.checker.check(sign.copy(publicKey = keysRead.publicKey), data).isOk shouldBe true
|
algo.checker(keys.publicKey).check(sign, data).isOk shouldBe true
|
||||||
algo.checker.check(sign, data).isOk shouldBe true
|
algo.checker(keysRead.publicKey).check(sign, data).isOk shouldBe true
|
||||||
|
|
||||||
//try to store key into previously created file
|
//try to store key into previously created file
|
||||||
storage.storeSecretKey(keys).isFailure shouldBe true
|
storage.storeSecretKey(keys).isFailure shouldBe true
|
||||||
|
@ -19,6 +19,7 @@ package fluence.crypto
|
|||||||
|
|
||||||
import cats.Monad
|
import cats.Monad
|
||||||
import cats.data.EitherT
|
import cats.data.EitherT
|
||||||
|
import fluence.crypto.SignAlgo.CheckerFn
|
||||||
import fluence.crypto.algorithm.{CryptoErr, DumbSign, KeyGenerator, SignatureFunctions}
|
import fluence.crypto.algorithm.{CryptoErr, DumbSign, KeyGenerator, SignatureFunctions}
|
||||||
import fluence.crypto.keypair.KeyPair
|
import fluence.crypto.keypair.KeyPair
|
||||||
import fluence.crypto.signature.{Signature, SignatureChecker, Signer}
|
import fluence.crypto.signature.{Signature, SignatureChecker, Signer}
|
||||||
@ -49,18 +50,26 @@ class SignAlgo(name: String, algo: KeyGenerator with SignatureFunctions) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checker is single for each algo, and does not contain any state
|
* Checker is specific for public key
|
||||||
|
* @param publicKey Public key of signature maker
|
||||||
|
* @return
|
||||||
*/
|
*/
|
||||||
implicit val checker: SignatureChecker = new SignatureChecker {
|
def checker(publicKey: KeyPair.Public): SignatureChecker = new SignatureChecker {
|
||||||
override def check[F[_]: Monad](signature: Signature, plain: ByteVector): EitherT[F, CryptoErr, Unit] =
|
override def check[F[_]: Monad](signature: ByteVector, plain: ByteVector): EitherT[F, CryptoErr, Unit] =
|
||||||
algo.verify(signature, plain)
|
algo.verify(Signature(publicKey, signature), plain)
|
||||||
|
|
||||||
override def toString: String = s"SignatureChecker($name)"
|
override def toString: String = s"SignatureChecker($name)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Fn for creating checker for specified public key */
|
||||||
|
implicit val checkerFn: CheckerFn = pubKey ⇒ checker(pubKey)
|
||||||
|
|
||||||
override def toString: String = s"SignAlgo($name)"
|
override def toString: String = s"SignAlgo($name)"
|
||||||
}
|
}
|
||||||
|
|
||||||
object SignAlgo {
|
object SignAlgo {
|
||||||
|
|
||||||
|
type CheckerFn = KeyPair.Public ⇒ SignatureChecker
|
||||||
|
|
||||||
val dumb = new SignAlgo("dumb", new DumbSign())
|
val dumb = new SignAlgo("dumb", new DumbSign())
|
||||||
}
|
}
|
||||||
|
@ -20,4 +20,5 @@ package fluence.crypto.signature
|
|||||||
import fluence.crypto.keypair.KeyPair
|
import fluence.crypto.keypair.KeyPair
|
||||||
import scodec.bits.ByteVector
|
import scodec.bits.ByteVector
|
||||||
|
|
||||||
|
// todo remove PubKey from signature
|
||||||
case class Signature(publicKey: KeyPair.Public, sign: ByteVector)
|
case class Signature(publicKey: KeyPair.Public, sign: ByteVector)
|
||||||
|
@ -25,5 +25,5 @@ import scodec.bits.ByteVector
|
|||||||
import scala.language.higherKinds
|
import scala.language.higherKinds
|
||||||
|
|
||||||
trait SignatureChecker {
|
trait SignatureChecker {
|
||||||
def check[F[_]: Monad](signature: Signature, plain: ByteVector): EitherT[F, CryptoErr, Unit]
|
def check[F[_]: Monad](signature: ByteVector, plain: ByteVector): EitherT[F, CryptoErr, Unit]
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user