Skip to content

Commit

Permalink
reorganize packages so it is less annoying to use.
Browse files Browse the repository at this point in the history
  • Loading branch information
fiatjaf committed Aug 8, 2022
1 parent 5e390b9 commit fe9528b
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 84 deletions.
26 changes: 18 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,38 @@
sn-sha256
=========

SHA256 + HMAC + HKDF implementations in C for use in Scala 3 Native.
Copied from https://github.com/rustyrussell/ccan.
This library provides not only sha256, but also:

- sha512
- ripemd160
- hmac-sha256
- hmac-sha512
- hkdf-sha256

All the code is C carefully copied from https://github.com/rustyrussell/ccan and embedded in the `resources/` directory.

Installation
------------

```sbt
libraryDependencies += "com.fiatjaf" %%% "sn-sha256" % "0.3.0"
libraryDependencies += "com.fiatjaf" %%% "sn-sha256" % "0.4.0"
```

Usage
-----

This library provides: `Sha256.sha256()`, `Hmac.hmac()` and `Hkdf.hkdf()`. Use it as follows:
No need to import anything, it's reasonable to use directly, like in the example below:

```scala
import scala.scalanative.unsigned._
import sha256.{Sha256, Hkdf, Hmac}

// basic sha256
Sha256.sha256("a string") // ==> Array[UByte](192, 220, 134, 239, 218, 0, 96, 212, 8, 64, 152, 169, 14, 201, 43, 61, 74, 168, 157, 127, 126, 15, 186, 84, 36, 86, 29, 33, 69, 30, 23, 88)
sha256.sha256("a string") // ==> Array[UByte](192, 220, 134, 239, 218, 0, 96, 212, 8, 64, 152, 169, 14, 201, 43, 61, 74, 168, 157, 127, 126, 15, 186, 84, 36, 86, 29, 33, 69, 30, 23, 88)
val r = Sha256.sha256(Array[UByte](12.toUByte, 23.toUByte, 244.toUByte, 180.toUByte))
bytes2hex(r) // ==> "c8010c6ca931acf480fab946f52d6abf81de50f797a666017cb4f0347c0974f9"

// hmac-sha256
val r = Hmac.hmac(
val r = hmac256.hmac(
"123456".getBytes.map(_.toUByte)
"abcdef".getBytes.map(_.toUByte),
)
Expand All @@ -36,6 +42,10 @@ bytes2hex(r) // ==> "ec4a11a5568e5cfdb5fbfe7152e8920d7bad864a0645c57fe49046a3e81
val secret = hex2bytes("40d0542e65d5bdb096051a21aa9af7eebfa3cf4f8e3cd367bc408e4fa91629b3")
val info = "nodeid".getBytes.map(_.toUByte)
val salt = Array(0.toUByte)
val r = Hkdf.hkdf(salt, secret, info, 32)
val r = hkdf256.hkdf(salt, secret, info, 32)
bytes2hex(r) // ==> "a754786431d51674edc4f04a568a55f37b996db70fa2a795b15e2ea57cfed8be"

// and so on
```

See the [API docs](https://www.javadoc.io/doc/com.fiatjaf/sn-sha256_native0.4_3/latest/index.html).
4 changes: 2 additions & 2 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
enablePlugins(ScalaNativePlugin)

scalaVersion := "3.1.1"
scalaVersion := "3.1.3"
organization := "com.fiatjaf"
name := "sn-sha256"
version := "0.3.0"
version := "0.4.0"
sonatypeProfileName := "com.fiatjaf"
homepage := Some(url("https://github.com/fiatjaf/sn-sha256"))
scmInfo := Some(ScmInfo(url("https://github.com/fiatjaf/sn-sha256"), "git@github.com:fiatjaf/sn-sha256.git"))
Expand Down
30 changes: 14 additions & 16 deletions src/main/scala/sha256/Hkdf.scala → src/main/scala/Hkdf.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package sha256

import scala.scalanative.libc.stdlib
import scala.scalanative.libc.string
import scala.scalanative.unsafe._
import scala.scalanative.unsigned._

object Hkdf {
package object hkdf256 {
def hkdf(
salt: Array[UByte],
secret: Array[UByte],
Expand Down Expand Up @@ -52,18 +50,18 @@ object Hkdf {
}
}
}
}

@extern
object HkdfExtern {
def hkdf_sha256(
okm: Ptr[UByte],
okm_size: CSize,
s: Ptr[UByte],
ssize: CSize,
k: Ptr[UByte],
ksize: CSize,
info: Ptr[UByte],
isize: CSize
): Unit = extern
@extern
object HkdfExtern {
def hkdf_sha256(
okm: Ptr[UByte],
okm_size: CSize,
s: Ptr[UByte],
ssize: CSize,
k: Ptr[UByte],
ksize: CSize,
info: Ptr[UByte],
isize: CSize
): Unit = extern
}
}
24 changes: 11 additions & 13 deletions src/main/scala/sha256/Hmac.scala → src/main/scala/Hmac.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package sha256

import scala.scalanative.libc.stdlib
import scala.scalanative.libc.string
import scala.scalanative.unsafe._
import scala.scalanative.unsigned._

object Hmac {
package object hmac256 {
def hmac(
key: Array[UByte],
msg: Array[UByte]
Expand Down Expand Up @@ -41,15 +39,15 @@ object Hmac {
}
}
}
}

@extern
object HmacExtern {
def hmac_sha256(
hmac: Ptr[UByte],
k: Ptr[UByte],
ksize: CSize,
d: Ptr[UByte],
dsize: CSize
): Unit = extern
@extern
object HmacExtern {
def hmac_sha256(
hmac: Ptr[UByte],
k: Ptr[UByte],
ksize: CSize,
d: Ptr[UByte],
dsize: CSize
): Unit = extern
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package sha256

import scala.scalanative.libc.stdlib
import scala.scalanative.libc.string
import scala.scalanative.unsafe._
import scala.scalanative.unsigned._

object Hmac512 {
package object hmac512 {
def hmac(
key: Array[UByte],
msg: Array[UByte]
Expand Down Expand Up @@ -41,15 +39,15 @@ object Hmac512 {
}
}
}
}

@extern
object Hmac512Extern {
def hmac_sha512(
hmac: Ptr[UByte],
k: Ptr[UByte],
ksize: CSize,
d: Ptr[UByte],
dsize: CSize
): Unit = extern
@extern
object Hmac512Extern {
def hmac_sha512(
hmac: Ptr[UByte],
k: Ptr[UByte],
ksize: CSize,
d: Ptr[UByte],
dsize: CSize
): Unit = extern
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package sha256

import scala.scalanative.libc.stdlib
import scala.scalanative.libc.string
import scala.scalanative.unsafe._
import scala.scalanative.unsigned._

object RipeMd160 {
package object ripemd160 {
def ripemd160(input: String): Array[UByte] = {
Zone { implicit z =>
{
Expand Down Expand Up @@ -41,10 +39,10 @@ object RipeMd160 {
stdlib.free(hash.asInstanceOf[Ptr[Byte]])
res
}
}

@extern
object RipeMd160Extern {
def ripemd160(hash: Ptr[UByte], payload: Ptr[UByte], len: CSize): Unit =
extern
@extern
object RipeMd160Extern {
def ripemd160(hash: Ptr[UByte], payload: Ptr[UByte], len: CSize): Unit =
extern
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package sha256

import scala.scalanative.libc.stdlib
import scala.scalanative.libc.string
import scala.scalanative.unsafe._
import scala.scalanative.unsigned._

object Sha256 {
package object sha256 {
def sha256(input: String): Array[UByte] = {
Zone { implicit z =>
{
Expand Down Expand Up @@ -41,9 +39,9 @@ object Sha256 {
stdlib.free(hash.asInstanceOf[Ptr[Byte]])
res
}
}

@extern
object Sha256Extern {
def sha256(hash: Ptr[UByte], payload: Ptr[UByte], len: CSize): Unit = extern
@extern
object Sha256Extern {
def sha256(hash: Ptr[UByte], payload: Ptr[UByte], len: CSize): Unit = extern
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package sha256

import scala.scalanative.libc.stdlib
import scala.scalanative.libc.string
import scala.scalanative.unsafe._
import scala.scalanative.unsigned._

object Sha512 {
package object sha512 {
def sha512(input: String): Array[UByte] = {
Zone { implicit z =>
{
Expand Down Expand Up @@ -41,9 +39,9 @@ object Sha512 {
stdlib.free(hash.asInstanceOf[Ptr[Byte]])
res
}
}

@extern
object Sha512Extern {
def sha512(hash: Ptr[UByte], payload: Ptr[UByte], len: CSize): Unit = extern
@extern
object Sha512Extern {
def sha512(hash: Ptr[UByte], payload: Ptr[UByte], len: CSize): Unit = extern
}
}
19 changes: 9 additions & 10 deletions src/test/scala/Test.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import scala.scalanative.unsigned._
import utest._
import sha256.{Sha256, Hkdf, Hmac, Sha512, Hmac512, RipeMd160}

object Sha256EtcTests extends TestSuite {
def bytes2hex(ba: Array[UByte]): String =
Expand All @@ -19,7 +18,7 @@ object Sha256EtcTests extends TestSuite {

val tests = Tests {
test("string hashing") {
val r = Sha256.sha256(
val r = sha256.sha256(
"a"
)

Expand All @@ -29,7 +28,7 @@ object Sha256EtcTests extends TestSuite {
}

test("big string hashing") {
val r = Sha256.sha256(
val r = sha256.sha256(
"A linha não respondia; ia andando. Buraco aberto pela agulha era logo enchido por ela, silenciosa e ativa, como quem sabe o que faz, e não está para ouvir palavras loucas. A agulha, vendo que ela não lhe dava resposta, calou-se também, e foi andando. E era tudo silêncio na saleta de costura; não se ouvia mais que o plic-plic-plic-plic da agulha no pano. Caindo o sol, a costureira dobrou a costura, para o dia seguinte. Continuou ainda nessa e no outro, até que no quarto acabou a obra, e ficou esperando o baile."
)

Expand All @@ -39,7 +38,7 @@ object Sha256EtcTests extends TestSuite {
}

test("bytearray hashing") {
val r = Sha256.sha256(
val r = sha256.sha256(
Array[UByte](2.toUByte, 4.toUByte, 201.toUByte, 203.toUByte)
)

Expand All @@ -49,7 +48,7 @@ object Sha256EtcTests extends TestSuite {
}

test("big bytearray hashing") {
val r = Sha256.sha256(Array.tabulate[UByte](256)(i => i.toUByte))
val r = sha256.sha256(Array.tabulate[UByte](256)(i => i.toUByte))

r.size ==> 32
bytes2hex(r) ==>
Expand All @@ -63,7 +62,7 @@ object Sha256EtcTests extends TestSuite {
val info = "nodeid".getBytes.map(_.toUByte)
val salt = Array(0.toUByte)

val r = Hkdf.hkdf(salt, secret, info, 32)
val r = hkdf256.hkdf(salt, secret, info, 32)
r.size ==> 32
bytes2hex(
r
Expand All @@ -74,7 +73,7 @@ object Sha256EtcTests extends TestSuite {
val key = "abcdef".getBytes.map(_.toUByte)
val msg = "123456".getBytes.map(_.toUByte)

val r = Hmac.hmac(key, msg)
val r = hmac256.hmac(key, msg)
r.size ==> 32
bytes2hex(
r
Expand All @@ -83,21 +82,21 @@ object Sha256EtcTests extends TestSuite {

test("sha512") {
bytes2hex(
Sha512.sha512("banana")
sha512.sha512("banana")
) ==> "f8e3183d38e6c51889582cb260ab825252f395b4ac8fb0e6b13e9a71f7c10a80d5301e4a949f2783cb0c20205f1d850f87045f4420ad2271c8fd5f0cd8944be3"
}

test("ripemd160") {
bytes2hex(
RipeMd160.ripemd160("banana")
ripemd160.ripemd160("banana")
) ==> "e8f92e55b15aec83f458cfee39dd4ffeb7f4b8ed"
}

test("hmac512") {
val key = "abcdef".getBytes.map(_.toUByte)
val msg = "123456".getBytes.map(_.toUByte)

val r = Hmac512.hmac(key, msg)
val r = hmac512.hmac(key, msg)
r.size ==> 64
bytes2hex(
r
Expand Down

0 comments on commit fe9528b

Please sign in to comment.