From cd2d604f2fe4ee4d87117363a2dd8fe5931ba442 Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 11:07:28 +0300 Subject: [PATCH 01/11] Encoders from Scorex completely replaced, Mnemonic utils. --- build.sbt | 2 +- .../org/encryfoundation/common/Algos.scala | 8 ++- .../common/crypto/PrivateKey25519.scala | 1 - .../common/crypto/encoding/Base16.scala | 13 ++++ .../common/crypto/encoding/Base58.scala | 67 +++++++++++++++++++ .../common/crypto/encoding/Base58Check.scala | 2 - .../common/transaction/EncryAddress.scala | 1 - .../common/utils/Mnemonic.scala | 24 +++++++ 8 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 src/main/scala/org/encryfoundation/common/crypto/encoding/Base16.scala create mode 100644 src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala create mode 100644 src/main/scala/org/encryfoundation/common/utils/Mnemonic.scala diff --git a/build.sbt b/build.sbt index 61e040f..a934e00 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ name := "encry-common" -version := "0.1.5" +version := "0.2.0" scalaVersion := "2.12.6" diff --git a/src/main/scala/org/encryfoundation/common/Algos.scala b/src/main/scala/org/encryfoundation/common/Algos.scala index 11ead11..cccf44d 100644 --- a/src/main/scala/org/encryfoundation/common/Algos.scala +++ b/src/main/scala/org/encryfoundation/common/Algos.scala @@ -1,19 +1,21 @@ package org.encryfoundation.common import java.nio.charset.Charset + +import org.encryfoundation.common.crypto.encoding.Base16 import scorex.crypto.authds.LeafData import scorex.crypto.authds.merkle.MerkleTree -import scorex.util.encode.Base16 import scorex.crypto.hash.{Blake2b256, Digest32} + import scala.util.Try object Algos { type HF = Blake2b256.type - def encode(bytes: Array[Byte]): String = encoder.encode(bytes) + def encode(bytes: Array[Byte]): String = Base16.encode(bytes) - def decode(str: String): Try[Array[Byte]] = encoder.decode(str) + def decode(str: String): Try[Array[Byte]] = Base16.decode(str) val hash: HF = Blake2b256 diff --git a/src/main/scala/org/encryfoundation/common/crypto/PrivateKey25519.scala b/src/main/scala/org/encryfoundation/common/crypto/PrivateKey25519.scala index 2a2b8b0..7de66da 100644 --- a/src/main/scala/org/encryfoundation/common/crypto/PrivateKey25519.scala +++ b/src/main/scala/org/encryfoundation/common/crypto/PrivateKey25519.scala @@ -3,7 +3,6 @@ package org.encryfoundation.common.crypto import com.google.common.primitives.Bytes import org.encryfoundation.common.serialization.{BytesSerializable, Serializer} import scorex.crypto.signatures.{Curve25519, PrivateKey, PublicKey} - import scala.util.Try trait SecretWrapper extends BytesSerializable diff --git a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base16.scala b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base16.scala new file mode 100644 index 0000000..c1dd4b9 --- /dev/null +++ b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base16.scala @@ -0,0 +1,13 @@ +package org.encryfoundation.common.crypto.encoding + +import org.bouncycastle.util.encoders.Hex +import scala.util.Try + +object Base16 { + + val Alphabet: String = "0123456789abcdefABCDEF" + + def encode(input: Array[Byte]): String = Hex.toHexString(input) + + def decode(input: String): Try[Array[Byte]] = Try(Hex.decode(input)) +} diff --git a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala new file mode 100644 index 0000000..c4b4eea --- /dev/null +++ b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala @@ -0,0 +1,67 @@ +package org.encryfoundation.common.crypto.encoding + +import scala.annotation.tailrec +import scala.util.{Success, Try} + +object Base58 { + + private val Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + + private val Base58Size = Alphabet.length + + private def index(char: Char): Option[Int] = char match { + case c if c <= '9' && c >= '1' => Some(c - '1') + case c if c <= 'k' && c >= 'a' => Some(c - 'a' + 33) + case c if c <= 'z' && c >= 'm' => Some(c - 'm' + 44) + case c if c >= 'A' && c <= 'H' => Some(c - 'A' + 9) + case c if c >= 'J' && c <= 'N' => Some(c - 'J' + 17) + case c if c >= 'P' && c <= 'Z' => Some(c - 'P' + 22) + case _ => None + } + + def encode(input: Array[Byte]): String = { + if (input.isEmpty) "" + else { + val bi: BigInt = BigInt(1, input) + val s: StringBuilder = new StringBuilder + + @tailrec + def append(rest: BigInt): Unit = { + val div: BigInt = rest / Base58Size + val mod: BigInt = rest % Base58Size + s.insert(0, Alphabet(mod.intValue)) + if (div > 0) append(div) + } + + append(bi) + + val zeros: Int = input.indexWhere(_ != 0) + 0 until zeros foreach { _ => s.insert(0, Alphabet(0)) } + + s.toString + } + } + + def decode(input: String): Try[Array[Byte]] = { + if (input.isEmpty) Success(Array.empty[Byte]) + else { + def toBytes: String => Try[Array[Byte]] = (in: String) => Try { + val size: Int = in.length + in.zipWithIndex.foldRight(BigInt(0)) { (c, bi) => + index(c._1).map { i => + bi + (BigInt(i) * BigInt(Base58Size).pow(size - 1 - c._2)) + }.getOrElse(throw InvalidCharacterException(c._1, c._2)) + }.toByteArray.dropWhile(_ == 0) + } + + val (z: String, in) = input.span(_ == Alphabet.head) + val zeros: Array[Byte] = z.map(_ => 0: Byte).toArray + + if (in.isEmpty) Success(zeros) + else toBytes(in).map { bytes => zeros ++ bytes } + } + } + + case class InvalidCharacterException(char: Char, index: Int) extends IllegalArgumentException( + s"An invalid character ($char)) at index $index") +} diff --git a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58Check.scala b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58Check.scala index a391476..327f474 100644 --- a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58Check.scala +++ b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58Check.scala @@ -1,8 +1,6 @@ package org.encryfoundation.common.crypto.encoding -import scorex.util.encode.Base58 import scorex.crypto.hash.Blake2b256 - import scala.util.{Failure, Success, Try} object Base58Check { diff --git a/src/main/scala/org/encryfoundation/common/transaction/EncryAddress.scala b/src/main/scala/org/encryfoundation/common/transaction/EncryAddress.scala index 48ad28a..aa55e52 100644 --- a/src/main/scala/org/encryfoundation/common/transaction/EncryAddress.scala +++ b/src/main/scala/org/encryfoundation/common/transaction/EncryAddress.scala @@ -4,7 +4,6 @@ import org.encryfoundation.common.crypto.encoding.Base58Check import org.encryfoundation.common.transaction.EncryAddress.Address import org.encryfoundation.prismlang.compiler.CompiledContract.ContractHash import scorex.crypto.signatures.PublicKey - import scala.util.Try sealed trait EncryAddress { diff --git a/src/main/scala/org/encryfoundation/common/utils/Mnemonic.scala b/src/main/scala/org/encryfoundation/common/utils/Mnemonic.scala new file mode 100644 index 0000000..61b5d7a --- /dev/null +++ b/src/main/scala/org/encryfoundation/common/utils/Mnemonic.scala @@ -0,0 +1,24 @@ +package org.encryfoundation.common.utils + +import org.encryfoundation.common.Algos +import scodec.bits.BitVector +import scala.io.Source + +object Mnemonic { + + private def getWords(language: String = "english"): Array[String] = Source + .fromFile("src/main/resources/languages/" + language + "/words.txt").getLines.toArray + + def seedFromMnemonic(mnemonicCode: String, passPhrase: String = ""): Array[Byte] = + Algos.hash(mnemonicCode + "mnemonic=" + passPhrase) + + def entropyToMnemonicCode(entropy: Array[Byte]): String = { + val words: Array[String] = getWords() + val checkSum: BitVector = BitVector(Algos.hash(entropy)) + val entropyWithCheckSum: BitVector = BitVector(entropy) ++ checkSum.take(4) + + entropyWithCheckSum.grouped(11).map { i => + words(i.toInt(signed = false)) + }.mkString(" ") + } +} \ No newline at end of file From 7d88f92cbef63d562873bcccf42b9871160d47c8 Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 11:09:30 +0300 Subject: [PATCH 02/11] Tests for new encoders. --- .../common/crypto/encoding/Base16Spec.scala | 20 +++++++++++++++++++ .../common/crypto/encoding/Base58Spec.scala | 20 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/test/scala/org/encryfoundation/common/crypto/encoding/Base16Spec.scala create mode 100644 src/test/scala/org/encryfoundation/common/crypto/encoding/Base58Spec.scala diff --git a/src/test/scala/org/encryfoundation/common/crypto/encoding/Base16Spec.scala b/src/test/scala/org/encryfoundation/common/crypto/encoding/Base16Spec.scala new file mode 100644 index 0000000..fe75f13 --- /dev/null +++ b/src/test/scala/org/encryfoundation/common/crypto/encoding/Base16Spec.scala @@ -0,0 +1,20 @@ +package org.encryfoundation.common.crypto.encoding + +import org.scalatest.{Matchers, PropSpec} +import scorex.utils.Random + +class Base16Spec extends PropSpec with Matchers { + + private val iData = Random.randomBytes() + + property("encode/decode") { + + val dEncoded = Base16.encode(iData) + + val dDecoded = Base16.decode(dEncoded) + + dDecoded.isSuccess shouldBe true + + iData sameElements dDecoded.get shouldBe true + } +} diff --git a/src/test/scala/org/encryfoundation/common/crypto/encoding/Base58Spec.scala b/src/test/scala/org/encryfoundation/common/crypto/encoding/Base58Spec.scala new file mode 100644 index 0000000..c1692f6 --- /dev/null +++ b/src/test/scala/org/encryfoundation/common/crypto/encoding/Base58Spec.scala @@ -0,0 +1,20 @@ +package org.encryfoundation.common.crypto.encoding + +import org.scalatest.{Matchers, PropSpec} +import scorex.utils.Random + +class Base58Spec extends PropSpec with Matchers { + + private val iData = Random.randomBytes() + + property("encode/decode") { + + val dEncoded = Base58.encode(iData) + + val dDecoded = Base58.decode(dEncoded) + + dDecoded.isSuccess shouldBe true + + iData sameElements dDecoded.get shouldBe true + } +} From a64987dded7001533f47ae5850e8867119295605 Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 11:14:30 +0300 Subject: [PATCH 03/11] Redundant braces removed. --- .../org/encryfoundation/common/crypto/encoding/Base58.scala | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala index c4b4eea..9159256 100644 --- a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala +++ b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala @@ -19,7 +19,7 @@ object Base58 { case _ => None } - def encode(input: Array[Byte]): String = { + def encode(input: Array[Byte]): String = if (input.isEmpty) "" else { val bi: BigInt = BigInt(1, input) @@ -40,9 +40,8 @@ object Base58 { s.toString } - } - def decode(input: String): Try[Array[Byte]] = { + def decode(input: String): Try[Array[Byte]] = if (input.isEmpty) Success(Array.empty[Byte]) else { def toBytes: String => Try[Array[Byte]] = (in: String) => Try { @@ -60,7 +59,6 @@ object Base58 { if (in.isEmpty) Success(zeros) else toBytes(in).map { bytes => zeros ++ bytes } } - } case class InvalidCharacterException(char: Char, index: Int) extends IllegalArgumentException( s"An invalid character ($char)) at index $index") From 0490181af8cb9f276e64bfd9da1cbb800a385817 Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 11:15:19 +0300 Subject: [PATCH 04/11] Spaces. --- src/main/scala/org/encryfoundation/common/Algos.scala | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/scala/org/encryfoundation/common/Algos.scala b/src/main/scala/org/encryfoundation/common/Algos.scala index cccf44d..2604a32 100644 --- a/src/main/scala/org/encryfoundation/common/Algos.scala +++ b/src/main/scala/org/encryfoundation/common/Algos.scala @@ -1,12 +1,10 @@ package org.encryfoundation.common import java.nio.charset.Charset - import org.encryfoundation.common.crypto.encoding.Base16 import scorex.crypto.authds.LeafData import scorex.crypto.authds.merkle.MerkleTree import scorex.crypto.hash.{Blake2b256, Digest32} - import scala.util.Try object Algos { From ef7eaec3a811d64a4dca708b274b1d33beac98b8 Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 11:16:28 +0300 Subject: [PATCH 05/11] Ident --- .../org/encryfoundation/common/crypto/encoding/Base58.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala index 9159256..62874f7 100644 --- a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala +++ b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala @@ -45,7 +45,7 @@ object Base58 { if (input.isEmpty) Success(Array.empty[Byte]) else { def toBytes: String => Try[Array[Byte]] = (in: String) => Try { - val size: Int = in.length + val size: Int = in.length in.zipWithIndex.foldRight(BigInt(0)) { (c, bi) => index(c._1).map { i => bi + (BigInt(i) * BigInt(Base58Size).pow(size - 1 - c._2)) From 83d5b560e15c30be427bf30582d2484633d9d026 Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 11:30:59 +0300 Subject: [PATCH 06/11] Make Alphabet public. --- .../org/encryfoundation/common/crypto/encoding/Base58.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala index 62874f7..b317e7e 100644 --- a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala +++ b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala @@ -5,7 +5,7 @@ import scala.util.{Success, Try} object Base58 { - private val Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + val Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" private val Base58Size = Alphabet.length From 2895f9e2b2bd86852a76d63fe57a3b3033ea547d Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 11:32:48 +0300 Subject: [PATCH 07/11] Type annotations. --- .../org/encryfoundation/common/crypto/encoding/Base58.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala index b317e7e..f733864 100644 --- a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala +++ b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala @@ -5,9 +5,9 @@ import scala.util.{Success, Try} object Base58 { - val Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + val Alphabet: String = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" - private val Base58Size = Alphabet.length + private val Base58Size: Int = Alphabet.length private def index(char: Char): Option[Int] = char match { case c if c <= '9' && c >= '1' => Some(c - '1') From ed119ff0807f7c5cd185e6d0fda00a1cc3003e68 Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 13:06:20 +0300 Subject: [PATCH 08/11] Prism updated. --- build.sbt | 4 +- .../org/encryfoundation/common/Algos.scala | 3 +- .../common/crypto/encoding/Base16.scala | 13 ---- .../common/crypto/encoding/Base58.scala | 65 ------------------- .../common/crypto/encoding/Base58Check.scala | 22 ------- .../common/transaction/EncryAddress.scala | 2 +- .../common/crypto/encoding/Base16Spec.scala | 20 ------ .../crypto/encoding/Base58CheckSpec.scala | 20 ------ .../common/crypto/encoding/Base58Spec.scala | 20 ------ .../common/transaction/EncryAddressSpec.scala | 2 +- 10 files changed, 6 insertions(+), 165 deletions(-) delete mode 100644 src/main/scala/org/encryfoundation/common/crypto/encoding/Base16.scala delete mode 100644 src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala delete mode 100644 src/main/scala/org/encryfoundation/common/crypto/encoding/Base58Check.scala delete mode 100644 src/test/scala/org/encryfoundation/common/crypto/encoding/Base16Spec.scala delete mode 100644 src/test/scala/org/encryfoundation/common/crypto/encoding/Base58CheckSpec.scala delete mode 100644 src/test/scala/org/encryfoundation/common/crypto/encoding/Base58Spec.scala diff --git a/build.sbt b/build.sbt index a934e00..bad0197 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ name := "encry-common" -version := "0.2.0" +version := "0.2.1" scalaVersion := "2.12.6" @@ -22,7 +22,7 @@ val apiDependencies = Seq( libraryDependencies ++= Seq( "com.google.guava" % "guava" % "21.+", "org.scorexfoundation" %% "scrypto" % "2.1.+", - "org.encry" %% "prism" % "0.2.7", + "org.encry" %% "prism" % "0.3.0", "org.scalatest" %% "scalatest" % "3.0.3" % "test" ) ++ apiDependencies diff --git a/src/main/scala/org/encryfoundation/common/Algos.scala b/src/main/scala/org/encryfoundation/common/Algos.scala index 2604a32..2b39917 100644 --- a/src/main/scala/org/encryfoundation/common/Algos.scala +++ b/src/main/scala/org/encryfoundation/common/Algos.scala @@ -1,7 +1,8 @@ package org.encryfoundation.common import java.nio.charset.Charset -import org.encryfoundation.common.crypto.encoding.Base16 + +import org.encryfoundation.utils.encoding.Base16 import scorex.crypto.authds.LeafData import scorex.crypto.authds.merkle.MerkleTree import scorex.crypto.hash.{Blake2b256, Digest32} diff --git a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base16.scala b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base16.scala deleted file mode 100644 index c1dd4b9..0000000 --- a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base16.scala +++ /dev/null @@ -1,13 +0,0 @@ -package org.encryfoundation.common.crypto.encoding - -import org.bouncycastle.util.encoders.Hex -import scala.util.Try - -object Base16 { - - val Alphabet: String = "0123456789abcdefABCDEF" - - def encode(input: Array[Byte]): String = Hex.toHexString(input) - - def decode(input: String): Try[Array[Byte]] = Try(Hex.decode(input)) -} diff --git a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala deleted file mode 100644 index f733864..0000000 --- a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58.scala +++ /dev/null @@ -1,65 +0,0 @@ -package org.encryfoundation.common.crypto.encoding - -import scala.annotation.tailrec -import scala.util.{Success, Try} - -object Base58 { - - val Alphabet: String = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" - - private val Base58Size: Int = Alphabet.length - - private def index(char: Char): Option[Int] = char match { - case c if c <= '9' && c >= '1' => Some(c - '1') - case c if c <= 'k' && c >= 'a' => Some(c - 'a' + 33) - case c if c <= 'z' && c >= 'm' => Some(c - 'm' + 44) - case c if c >= 'A' && c <= 'H' => Some(c - 'A' + 9) - case c if c >= 'J' && c <= 'N' => Some(c - 'J' + 17) - case c if c >= 'P' && c <= 'Z' => Some(c - 'P' + 22) - case _ => None - } - - def encode(input: Array[Byte]): String = - if (input.isEmpty) "" - else { - val bi: BigInt = BigInt(1, input) - val s: StringBuilder = new StringBuilder - - @tailrec - def append(rest: BigInt): Unit = { - val div: BigInt = rest / Base58Size - val mod: BigInt = rest % Base58Size - s.insert(0, Alphabet(mod.intValue)) - if (div > 0) append(div) - } - - append(bi) - - val zeros: Int = input.indexWhere(_ != 0) - 0 until zeros foreach { _ => s.insert(0, Alphabet(0)) } - - s.toString - } - - def decode(input: String): Try[Array[Byte]] = - if (input.isEmpty) Success(Array.empty[Byte]) - else { - def toBytes: String => Try[Array[Byte]] = (in: String) => Try { - val size: Int = in.length - in.zipWithIndex.foldRight(BigInt(0)) { (c, bi) => - index(c._1).map { i => - bi + (BigInt(i) * BigInt(Base58Size).pow(size - 1 - c._2)) - }.getOrElse(throw InvalidCharacterException(c._1, c._2)) - }.toByteArray.dropWhile(_ == 0) - } - - val (z: String, in) = input.span(_ == Alphabet.head) - val zeros: Array[Byte] = z.map(_ => 0: Byte).toArray - - if (in.isEmpty) Success(zeros) - else toBytes(in).map { bytes => zeros ++ bytes } - } - - case class InvalidCharacterException(char: Char, index: Int) extends IllegalArgumentException( - s"An invalid character ($char)) at index $index") -} diff --git a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58Check.scala b/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58Check.scala deleted file mode 100644 index 327f474..0000000 --- a/src/main/scala/org/encryfoundation/common/crypto/encoding/Base58Check.scala +++ /dev/null @@ -1,22 +0,0 @@ -package org.encryfoundation.common.crypto.encoding - -import scorex.crypto.hash.Blake2b256 -import scala.util.{Failure, Success, Try} - -object Base58Check { - - val Version: Byte = 1 - val ChecksumLength: Int = 4 - - private def getChecksum(bytes: Array[Byte]): Array[Byte] = Blake2b256.hash(bytes).take(ChecksumLength) - - def encode(input: Array[Byte]): String = Base58.encode((Version +: input) ++ getChecksum(input)) - - def decode(input: String): Try[Array[Byte]] = Base58.decode(input).flatMap { bytes => - val checksum: Array[Byte] = bytes.takeRight(ChecksumLength) - val checksumActual: Array[Byte] = getChecksum(bytes.dropRight(ChecksumLength).tail) - - if (checksum.sameElements(checksumActual)) Success(bytes.dropRight(ChecksumLength).tail) - else Failure(new Exception("Wrong checksum")) - } -} diff --git a/src/main/scala/org/encryfoundation/common/transaction/EncryAddress.scala b/src/main/scala/org/encryfoundation/common/transaction/EncryAddress.scala index aa55e52..8c2e891 100644 --- a/src/main/scala/org/encryfoundation/common/transaction/EncryAddress.scala +++ b/src/main/scala/org/encryfoundation/common/transaction/EncryAddress.scala @@ -1,8 +1,8 @@ package org.encryfoundation.common.transaction -import org.encryfoundation.common.crypto.encoding.Base58Check import org.encryfoundation.common.transaction.EncryAddress.Address import org.encryfoundation.prismlang.compiler.CompiledContract.ContractHash +import org.encryfoundation.utils.encoding.Base58Check import scorex.crypto.signatures.PublicKey import scala.util.Try diff --git a/src/test/scala/org/encryfoundation/common/crypto/encoding/Base16Spec.scala b/src/test/scala/org/encryfoundation/common/crypto/encoding/Base16Spec.scala deleted file mode 100644 index fe75f13..0000000 --- a/src/test/scala/org/encryfoundation/common/crypto/encoding/Base16Spec.scala +++ /dev/null @@ -1,20 +0,0 @@ -package org.encryfoundation.common.crypto.encoding - -import org.scalatest.{Matchers, PropSpec} -import scorex.utils.Random - -class Base16Spec extends PropSpec with Matchers { - - private val iData = Random.randomBytes() - - property("encode/decode") { - - val dEncoded = Base16.encode(iData) - - val dDecoded = Base16.decode(dEncoded) - - dDecoded.isSuccess shouldBe true - - iData sameElements dDecoded.get shouldBe true - } -} diff --git a/src/test/scala/org/encryfoundation/common/crypto/encoding/Base58CheckSpec.scala b/src/test/scala/org/encryfoundation/common/crypto/encoding/Base58CheckSpec.scala deleted file mode 100644 index a2d166a..0000000 --- a/src/test/scala/org/encryfoundation/common/crypto/encoding/Base58CheckSpec.scala +++ /dev/null @@ -1,20 +0,0 @@ -package org.encryfoundation.common.crypto.encoding - -import org.scalatest.{Matchers, PropSpec} -import scorex.utils.Random - -class Base58CheckSpec extends PropSpec with Matchers { - - private val iData = Random.randomBytes() - - property("encode/decode") { - - val dEncoded = Base58Check.encode(iData) - - val dDecoded = Base58Check.decode(dEncoded) - - dDecoded.isSuccess shouldBe true - - iData sameElements dDecoded.get shouldBe true - } -} diff --git a/src/test/scala/org/encryfoundation/common/crypto/encoding/Base58Spec.scala b/src/test/scala/org/encryfoundation/common/crypto/encoding/Base58Spec.scala deleted file mode 100644 index c1692f6..0000000 --- a/src/test/scala/org/encryfoundation/common/crypto/encoding/Base58Spec.scala +++ /dev/null @@ -1,20 +0,0 @@ -package org.encryfoundation.common.crypto.encoding - -import org.scalatest.{Matchers, PropSpec} -import scorex.utils.Random - -class Base58Spec extends PropSpec with Matchers { - - private val iData = Random.randomBytes() - - property("encode/decode") { - - val dEncoded = Base58.encode(iData) - - val dDecoded = Base58.decode(dEncoded) - - dDecoded.isSuccess shouldBe true - - iData sameElements dDecoded.get shouldBe true - } -} diff --git a/src/test/scala/org/encryfoundation/common/transaction/EncryAddressSpec.scala b/src/test/scala/org/encryfoundation/common/transaction/EncryAddressSpec.scala index a86d178..910f9f2 100644 --- a/src/test/scala/org/encryfoundation/common/transaction/EncryAddressSpec.scala +++ b/src/test/scala/org/encryfoundation/common/transaction/EncryAddressSpec.scala @@ -1,7 +1,7 @@ package org.encryfoundation.common.transaction -import org.encryfoundation.common.crypto.encoding.Base58Check import org.encryfoundation.common.transaction.EncryAddress.Address +import org.encryfoundation.utils.encoding.Base58Check import org.scalatest.{Matchers, PropSpec} import scorex.util.encode.Base58 import scorex.crypto.signatures.{Curve25519, PublicKey} From 8a36487f94fd23216ef63939810b5b8d6c1bf289 Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 14:04:16 +0300 Subject: [PATCH 09/11] Empty line removal. --- src/main/scala/org/encryfoundation/common/Algos.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/scala/org/encryfoundation/common/Algos.scala b/src/main/scala/org/encryfoundation/common/Algos.scala index 2b39917..818989f 100644 --- a/src/main/scala/org/encryfoundation/common/Algos.scala +++ b/src/main/scala/org/encryfoundation/common/Algos.scala @@ -1,7 +1,6 @@ package org.encryfoundation.common import java.nio.charset.Charset - import org.encryfoundation.utils.encoding.Base16 import scorex.crypto.authds.LeafData import scorex.crypto.authds.merkle.MerkleTree From acf6207079a58370856a161b857392e1c1104940 Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 14:41:59 +0300 Subject: [PATCH 10/11] Transitional deps removal. --- build.sbt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/build.sbt b/build.sbt index bad0197..0404c41 100644 --- a/build.sbt +++ b/build.sbt @@ -16,14 +16,11 @@ val circeVersion = "0.9.3" val apiDependencies = Seq( "io.circe" %% "circe-core" % circeVersion, "io.circe" %% "circe-generic" % circeVersion, - "io.circe" %% "circe-parser" % circeVersion, + "io.circe" %% "circe-parser" % circeVersion ) libraryDependencies ++= Seq( - "com.google.guava" % "guava" % "21.+", - "org.scorexfoundation" %% "scrypto" % "2.1.+", - "org.encry" %% "prism" % "0.3.0", - "org.scalatest" %% "scalatest" % "3.0.3" % "test" + "org.encry" %% "prism" % "0.3.0" ) ++ apiDependencies licenses in ThisBuild := Seq("GNU GPL 3.0" -> url("https://github.com/EncryFoundation/EncryCommon/blob/master/LICENSE")) From f2fe591f7f86cf8f82bb7d085cfc618afb2681b2 Mon Sep 17 00:00:00 2001 From: Ilya Oskin Date: Fri, 10 Aug 2018 16:28:58 +0300 Subject: [PATCH 11/11] Fix deps. --- build.sbt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 0404c41..c727636 100644 --- a/build.sbt +++ b/build.sbt @@ -20,7 +20,8 @@ val apiDependencies = Seq( ) libraryDependencies ++= Seq( - "org.encry" %% "prism" % "0.3.0" + "org.encry" %% "prism" % "0.3.0", + "org.scalatest" %% "scalatest" % "3.0.3" % "test" ) ++ apiDependencies licenses in ThisBuild := Seq("GNU GPL 3.0" -> url("https://github.com/EncryFoundation/EncryCommon/blob/master/LICENSE"))