KademliaMVar.client and Kademlia.findNode (#49)

* KademliaMVar.client and Kademlia.findNode

* scalariform formatting & tiny bugfix

* sbt ops for travis?

* constant b64seed in Contact

* merge master

* compilation bugfix

* possible fix

* review fixes
This commit is contained in:
Dmitry Kurinskiy 2018-02-16 09:00:35 +03:00 committed by GitHub
parent 927c872631
commit 88d640dbf6
6 changed files with 25 additions and 9 deletions

View File

@ -19,6 +19,7 @@ package fluence.crypto.algorithm
import cats.data.EitherT
import cats.{ Monad, MonadError }
import fluence.crypto.SignAlgo
import fluence.crypto.facade.EC
import fluence.crypto.hash.{ CryptoHasher, JsCryptoHasher }
import fluence.crypto.keypair.KeyPair
@ -82,5 +83,7 @@ class EcdsaJS(ec: EC, hasher: Option[CryptoHasher[Array[Byte], Array[Byte]]]) ex
}
object EcdsaJS {
def ecdsa_secp256k1_sha256 = new EcdsaJS(new EC("secp256k1"), Some(JsCryptoHasher.Sha256))
val ecdsa_secp256k1_sha256 = new EcdsaJS(new EC("secp256k1"), Some(JsCryptoHasher.Sha256))
val signAlgo = new SignAlgo("ecdsa/secp256k1/sha256/js", ecdsa_secp256k1_sha256)
}

View File

@ -55,7 +55,7 @@ class EcdsaJSSpec extends WordSpec with Matchers {
}
"correctly work with signer and checker" in {
val algo = new SignAlgo(EcdsaJS.ecdsa_secp256k1_sha256)
val algo = EcdsaJS.signAlgo
val keys = algo.generateKeyPair().extract
val signer = algo.signer(keys)
@ -69,7 +69,7 @@ class EcdsaJSSpec extends WordSpec with Matchers {
}
"throw an errors on invalid data" in {
val algo = new SignAlgo(EcdsaJS.ecdsa_secp256k1_sha256)
val algo = EcdsaJS.signAlgo
val keys = algo.generateKeyPair().extract
val signer = algo.signer(keys)
val data = rndByteVector(10)

View File

@ -23,6 +23,7 @@ import java.security.interfaces.ECPrivateKey
import cats.data.EitherT
import cats.Monad
import fluence.crypto.SignAlgo
import fluence.crypto.hash.{ CryptoHasher, JdkCryptoHasher }
import fluence.crypto.keypair.KeyPair
import org.bouncycastle.jce.ECNamedCurveTable
@ -128,5 +129,7 @@ object Ecdsa {
* `NONEwithECDSA with sha-256 hasher` Preferably the size of the key is greater than or equal to the digest algorithm
* don't use `SHA256WithECDSA` because of non-compatibility with javascript libraries
*/
def ecdsa_secp256k1_sha256 = new Ecdsa("secp256k1", "NONEwithECDSA", Some(JdkCryptoHasher.Sha256))
val ecdsa_secp256k1_sha256 = new Ecdsa("secp256k1", "NONEwithECDSA", Some(JdkCryptoHasher.Sha256))
val signAlgo = new SignAlgo("ecdsa_secp256k1_sha256", ecdsa_secp256k1_sha256)
}

View File

@ -58,7 +58,7 @@ class SignatureSpec extends WordSpec with Matchers {
}
"correctly work with signer and checker" in {
val algo = new SignAlgo(Ecdsa.ecdsa_secp256k1_sha256)
val algo = Ecdsa.signAlgo
val keys = algo.generateKeyPair().extract
val signer = algo.signer(keys)
@ -72,7 +72,7 @@ class SignatureSpec extends WordSpec with Matchers {
}
"throw an errors on invalid data" in {
val algo = new SignAlgo(Ecdsa.ecdsa_secp256k1_sha256)
val algo = Ecdsa.signAlgo
val keys = algo.generateKeyPair().extract
val signer = algo.signer(keys)
val data = rndByteVector(10)
@ -84,7 +84,7 @@ class SignatureSpec extends WordSpec with Matchers {
}
"store and read key from file" in {
val algo = new SignAlgo(Ecdsa.ecdsa_secp256k1_sha256)
val algo = Ecdsa.signAlgo
val keys = algo.generateKeyPair().extract
val keyFile = File.createTempFile("test", "")

View File

@ -28,9 +28,10 @@ import scala.language.higherKinds
/**
* Class for generation keys, signers and checkers
* @param name Algo name for debugging
* @param algo implementation of sign alghoritms, e.g. ECDSA
*/
class SignAlgo(algo: KeyGenerator with SignatureFunctions) {
class SignAlgo(name: String, algo: KeyGenerator with SignatureFunctions) {
def generateKeyPair[F[_] : Monad](seed: Option[ByteVector] = None): EitherT[F, CryptoErr, KeyPair] =
algo.generateKeyPair(seed.map(_.toArray))
@ -38,13 +39,19 @@ class SignAlgo(algo: KeyGenerator with SignatureFunctions) {
def signer(kp: KeyPair): Signer = new Signer {
override def sign[F[_] : Monad](plain: ByteVector): EitherT[F, CryptoErr, Signature] = algo.sign(kp, plain)
override def publicKey: KeyPair.Public = kp.publicKey
override def toString: String = s"Signer($name, ${kp.publicKey})"
}
def checker: SignatureChecker = new SignatureChecker {
override def check[F[_] : Monad](signature: Signature, plain: ByteVector): EitherT[F, CryptoErr, Unit] = algo.verify(signature, plain)
override def toString: String = s"SignatureChecker($name)"
}
override def toString: String = s"SignAlgo($name)"
}
object SignAlgo {
val dumb = new SignAlgo(new DumbSign())
val dumb = new SignAlgo("dumb", new DumbSign())
}

View File

@ -25,6 +25,9 @@ import scodec.bits.ByteVector
import scala.language.higherKinds
/**
* Wraps public and private key, along with signing algorithm, to produce signatures
*/
trait Signer {
def publicKey: KeyPair.Public