Skip to content

Commit

Permalink
Rename Hash to Hasher, Digest to Hash
Browse files Browse the repository at this point in the history
  • Loading branch information
mpilquist committed Aug 25, 2024
1 parent 7c32bcb commit 73ed273
Show file tree
Hide file tree
Showing 13 changed files with 222 additions and 248 deletions.
6 changes: 3 additions & 3 deletions core/js/src/main/scala/fs2/hash.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
package fs2

import cats.effect.SyncIO
import fs2.hashing.{Hash, HashAlgorithm}
import fs2.hashing.{Hasher, HashAlgorithm}

/** Provides various cryptographic hashes as pipes. Supported only on Node.js. */
@deprecated("Use fs2.hashing.Hashing[F] instead", "3.11.0")
Expand All @@ -49,12 +49,12 @@ object hash {
private[this] def digest[F[_]](algorithm: HashAlgorithm): Pipe[F, Byte, Byte] =
source =>
Stream.suspend {
val h = Hash.unsafe[SyncIO](algorithm)
val h = Hasher.unsafe[SyncIO](algorithm)
source.chunks
.fold(h) { (h, c) =>
h.update(c).unsafeRunSync()
h
}
.flatMap(h => Stream.chunk(h.digest.unsafeRunSync().bytes))
.flatMap(h => Stream.chunk(h.hash.unsafeRunSync().bytes))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,33 +30,27 @@ import scala.scalajs.js
import scala.scalajs.js.annotation.JSImport
import scala.scalajs.js.typedarray.Uint8Array

trait HashCompanionPlatform {
trait HasherCompanionPlatform {

private[fs2] def apply[F[_]: Sync](algorithm: HashAlgorithm): Resource[F, Hash[F]] =
private[fs2] def apply[F[_]: Sync](algorithm: HashAlgorithm): Resource[F, Hasher[F]] =
Resource.eval(Sync[F].delay(unsafe(algorithm)))

private[hashing] def hmac[F[_]: Sync](
algorithm: HashAlgorithm,
key: Chunk[Byte]
): Resource[F, Hash[F]] =
): Resource[F, Hasher[F]] =
Resource.eval(Sync[F].delay(unsafeHmac(algorithm, key)))

private[fs2] def unsafe[F[_]: Sync](algorithm: HashAlgorithm): Hash[F] =
new Hash[F] {
private[fs2] def unsafe[F[_]: Sync](algorithm: HashAlgorithm): Hasher[F] =
new SyncHasher[F] {
private def newHash() = JsHash.createHash(toAlgorithmString(algorithm))
private var h = newHash()

def update(bytes: Chunk[Byte]): F[Unit] =
Sync[F].delay(unsafeUpdate(bytes))

def digest: F[Digest] =
Sync[F].delay(unsafeDigest())

def unsafeUpdate(chunk: Chunk[Byte]): Unit =
h.update(chunk.toUint8Array)

def unsafeDigest(): Digest = {
val result = Digest(Chunk.uint8Array(h.digest()))
def unsafeHash(): Hash = {
val result = Hash(Chunk.uint8Array(h.digest()))
h = newHash()
result
}
Expand All @@ -79,22 +73,16 @@ trait HashCompanionPlatform {
case HashAlgorithm.Named(name) => name
}

private[fs2] def unsafeHmac[F[_]: Sync](algorithm: HashAlgorithm, key: Chunk[Byte]): Hash[F] =
new Hash[F] {
private[fs2] def unsafeHmac[F[_]: Sync](algorithm: HashAlgorithm, key: Chunk[Byte]): Hasher[F] =
new SyncHasher[F] {
private def newHash() = JsHash.createHmac(toAlgorithmString(algorithm), key.toUint8Array)
private var h = newHash()

def update(bytes: Chunk[Byte]): F[Unit] =
Sync[F].delay(unsafeUpdate(bytes))

def digest: F[Digest] =
Sync[F].delay(unsafeDigest())

def unsafeUpdate(chunk: Chunk[Byte]): Unit =
h.update(chunk.toUint8Array)

def unsafeDigest(): Digest = {
val result = Digest(Chunk.uint8Array(h.digest()))
def unsafeHash(): Hash = {
val result = Hash(Chunk.uint8Array(h.digest()))
h = newHash()
result
}
Expand Down
12 changes: 6 additions & 6 deletions core/js/src/test/scala/fs2/hashing/HashingSuitePlatform.scala
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ package hashing
import scodec.bits.ByteVector

trait HashingSuitePlatform {
def digest(algo: HashAlgorithm, str: String): Digest = {
val hash = JsHash.createHash(Hash.toAlgorithmString(algo))
def digest(algo: HashAlgorithm, str: String): Hash = {
val hash = JsHash.createHash(Hasher.toAlgorithmString(algo))
hash.update(ByteVector.view(str.getBytes).toUint8Array)
Digest(Chunk.uint8Array(hash.digest()))
Hash(Chunk.uint8Array(hash.digest()))
}

def hmac(algo: HashAlgorithm, key: Chunk[Byte], str: String): Digest = {
val hash = JsHash.createHmac(Hash.toAlgorithmString(algo), key.toUint8Array)
def hmac(algo: HashAlgorithm, key: Chunk[Byte], str: String): Hash = {
val hash = JsHash.createHmac(Hasher.toAlgorithmString(algo), key.toUint8Array)
hash.update(ByteVector.view(str.getBytes).toUint8Array)
Digest(Chunk.uint8Array(hash.digest()))
Hash(Chunk.uint8Array(hash.digest()))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,18 @@ import java.security.MessageDigest
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec

private[hashing] trait HashCompanionPlatform {
private[hashing] trait HasherCompanionPlatform {

private[hashing] def apply[F[_]: Sync](algorithm: HashAlgorithm): Resource[F, Hash[F]] =
private[hashing] def apply[F[_]: Sync](algorithm: HashAlgorithm): Resource[F, Hasher[F]] =
Resource.eval(Sync[F].delay(unsafe(algorithm)))

private[hashing] def hmac[F[_]: Sync](
algorithm: HashAlgorithm,
key: Chunk[Byte]
): Resource[F, Hash[F]] =
): Resource[F, Hasher[F]] =
Resource.eval(Sync[F].delay(unsafeHmac(algorithm, key)))

private[hashing] def unsafe[F[_]: Sync](algorithm: HashAlgorithm): Hash[F] =
private[hashing] def unsafe[F[_]: Sync](algorithm: HashAlgorithm): Hasher[F] =
unsafeFromMessageDigest(MessageDigest.getInstance(toAlgorithmString(algorithm)))

private[hashing] def toAlgorithmString(algorithm: HashAlgorithm): String =
Expand All @@ -62,7 +62,7 @@ private[hashing] trait HashCompanionPlatform {
private[hashing] def unsafeHmac[F[_]: Sync](
algorithm: HashAlgorithm,
key: Chunk[Byte]
): Hash[F] = {
): Hasher[F] = {
val name = toMacAlgorithmString(algorithm)
val mac = Mac.getInstance(name)
mac.init(new SecretKeySpec(key.toArray, name))
Expand All @@ -86,37 +86,25 @@ private[hashing] trait HashCompanionPlatform {
case HashAlgorithm.Named(name) => name
}

def unsafeFromMessageDigest[F[_]: Sync](d: MessageDigest): Hash[F] =
new Hash[F] {
def update(bytes: Chunk[Byte]): F[Unit] =
Sync[F].delay(unsafeUpdate(bytes))

def digest: F[Digest] =
Sync[F].delay(unsafeDigest())

def unsafeFromMessageDigest[F[_]: Sync](d: MessageDigest): Hasher[F] =
new SyncHasher[F] {
def unsafeUpdate(chunk: Chunk[Byte]): Unit = {
val slice = chunk.toArraySlice
d.update(slice.values, slice.offset, slice.size)
}

def unsafeDigest(): Digest =
Digest(Chunk.array(d.digest()))
def unsafeHash(): Hash =
Hash(Chunk.array(d.digest()))
}

def unsafeFromMac[F[_]: Sync](d: Mac): Hash[F] =
new Hash[F] {
def update(bytes: Chunk[Byte]): F[Unit] =
Sync[F].delay(unsafeUpdate(bytes))

def digest: F[Digest] =
Sync[F].delay(unsafeDigest())

def unsafeFromMac[F[_]: Sync](d: Mac): Hasher[F] =
new SyncHasher[F] {
def unsafeUpdate(chunk: Chunk[Byte]): Unit = {
val slice = chunk.toArraySlice
d.update(slice.values, slice.offset, slice.size)
}

def unsafeDigest(): Digest =
Digest(Chunk.array(d.doFinal()))
def unsafeHash(): Hash =
Hash(Chunk.array(d.doFinal()))
}
}
12 changes: 6 additions & 6 deletions core/jvm/src/test/scala/fs2/hashing/HashingSuitePlatform.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,15 @@ import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec

trait HashingSuitePlatform {
def digest(algo: HashAlgorithm, str: String): Digest =
Digest(
Chunk.array(MessageDigest.getInstance(Hash.toAlgorithmString(algo)).digest(str.getBytes))
def digest(algo: HashAlgorithm, str: String): Hash =
Hash(
Chunk.array(MessageDigest.getInstance(Hasher.toAlgorithmString(algo)).digest(str.getBytes))
)

def hmac(algo: HashAlgorithm, key: Chunk[Byte], str: String): Digest = {
val name = Hash.toMacAlgorithmString(algo)
def hmac(algo: HashAlgorithm, key: Chunk[Byte], str: String): Hash = {
val name = Hasher.toMacAlgorithmString(algo)
val m = Mac.getInstance(name)
m.init(new SecretKeySpec(key.toArray, name))
Digest(Chunk.array(m.doFinal(str.getBytes)))
Hash(Chunk.array(m.doFinal(str.getBytes)))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ import org.typelevel.scalaccompat.annotation._
import scala.scalanative.unsafe._
import scala.scalanative.unsigned._

trait HashCompanionPlatform {
trait HasherCompanionPlatform {
import openssl._

private[hashing] def apply[F[_]](
algorithm: HashAlgorithm
)(implicit F: Sync[F]): Resource[F, Hash[F]] = {
)(implicit F: Sync[F]): Resource[F, Hasher[F]] = {
val zoneResource = Resource.make(F.delay(Zone.open()))(z => F.delay(z.close()))
zoneResource.flatMap { zone =>
val acquire = F.delay {
Expand All @@ -57,13 +57,7 @@ trait HashCompanionPlatform {
}
}
.map { case (ctx, init) =>
new Hash[F] {
def update(bytes: Chunk[Byte]): F[Unit] =
F.delay(unsafeUpdate(bytes))

def digest: F[Digest] =
F.delay(unsafeDigest())

new SyncHasher[F] {
def unsafeUpdate(chunk: Chunk[Byte]): Unit = {
val slice = chunk.toArraySlice
if (
Expand All @@ -72,12 +66,12 @@ trait HashCompanionPlatform {
throw new RuntimeException(s"EVP_DigestUpdate: ${getOpensslError()}")
}

def unsafeDigest(): Digest = {
def unsafeHash(): Hash = {
val md = new Array[Byte](EVP_MAX_MD_SIZE)
val size = stackalloc[CUnsignedInt]()
if (EVP_DigestFinal_ex(ctx, md.atUnsafe(0), size) != 1)
throw new RuntimeException(s"EVP_DigestFinal_ex: ${getOpensslError()}")
val result = Digest(Chunk.ArraySlice(md, 0, (!size).toInt))
val result = Hash(Chunk.ArraySlice(md, 0, (!size).toInt))
init()
result
}
Expand Down Expand Up @@ -105,7 +99,7 @@ trait HashCompanionPlatform {

private[hashing] def hmac[F[_]](algorithm: HashAlgorithm, key: Chunk[Byte])(implicit
F: Sync[F]
): Resource[F, Hash[F]] = {
): Resource[F, Hasher[F]] = {
val zoneResource = Resource.make(F.delay(Zone.open()))(z => F.delay(z.close()))
zoneResource.flatMap { zone =>
val acquire = F.delay {
Expand Down Expand Up @@ -138,25 +132,19 @@ trait HashCompanionPlatform {
}
}
.map { case (ctx, init) =>
new Hash[F] {
def update(bytes: Chunk[Byte]): F[Unit] =
F.delay(unsafeUpdate(bytes))

def digest: F[Digest] =
F.delay(unsafeDigest())

new SyncHasher[F] {
def unsafeUpdate(chunk: Chunk[Byte]): Unit = {
val slice = chunk.toArraySlice
if (HMAC_Update(ctx, slice.values.atUnsafe(slice.offset), slice.size.toULong) != 1)
throw new RuntimeException(s"HMAC_Update: ${getOpensslError()}")
}

def unsafeDigest(): Digest = {
def unsafeHash(): Hash = {
val md = new Array[Byte](EVP_MAX_MD_SIZE)
val size = stackalloc[CUnsignedInt]()
if (HMAC_Final(ctx, md.atUnsafe(0), size) != 1)
throw new RuntimeException(s"HMAC_Final: ${getOpensslError()}")
val result = Digest(Chunk.ArraySlice(md, 0, (!size).toInt))
val result = Hash(Chunk.ArraySlice(md, 0, (!size).toInt))
init()
result
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ import scala.scalanative.unsigned._
import hashing.openssl._

trait HashingSuitePlatform {
def digest(algo: HashAlgorithm, str: String): Digest = {
val name = Hash.toAlgorithmString(algo)
def digest(algo: HashAlgorithm, str: String): Hash = {
val name = Hasher.toAlgorithmString(algo)
val bytes = str.getBytes
val md = new Array[Byte](EVP_MAX_MD_SIZE)
val size = stackalloc[CUnsignedInt]()
Expand All @@ -42,11 +42,11 @@ trait HashingSuitePlatform {
`type`,
null
)
Digest(Chunk.array(md.take((!size).toInt)))
Hash(Chunk.array(md.take((!size).toInt)))
}

def hmac(algo: HashAlgorithm, key: Chunk[Byte], str: String): Digest = {
val name = Hash.toAlgorithmString(algo)
def hmac(algo: HashAlgorithm, key: Chunk[Byte], str: String): Hash = {
val name = Hasher.toAlgorithmString(algo)
val bytes = str.getBytes
val md = new Array[Byte](EVP_MAX_MD_SIZE)
val size = stackalloc[CUnsignedInt]()
Expand All @@ -61,6 +61,6 @@ trait HashingSuitePlatform {
md.atUnsafe(0),
size
)
Digest(Chunk.array(md.take((!size).toInt)))
Hash(Chunk.array(md.take((!size).toInt)))
}
}
47 changes: 0 additions & 47 deletions core/shared/src/main/scala/fs2/hashing/Digest.scala

This file was deleted.

Loading

0 comments on commit 73ed273

Please sign in to comment.