Refactor
This commit is contained in:
@@ -1,11 +1,12 @@
|
|||||||
package com.infendro.hash.util
|
package com.infendro.hash
|
||||||
|
|
||||||
import com.infendro.bytes.ByteOrder
|
import com.infendro.bytes.ByteOrder
|
||||||
import com.infendro.bytes.ByteOrder.BIG_ENDIAN
|
|
||||||
import com.infendro.bytes.int.copyInto
|
import com.infendro.bytes.int.copyInto
|
||||||
import com.infendro.bytes.long.copyInto
|
import com.infendro.bytes.long.copyInto
|
||||||
|
|
||||||
internal class Buffer(val size: Int) {
|
class Buffer(
|
||||||
|
val size: Int,
|
||||||
|
) {
|
||||||
val value = ByteArray(size)
|
val value = ByteArray(size)
|
||||||
var offset = 0
|
var offset = 0
|
||||||
|
|
||||||
@@ -34,12 +35,12 @@ internal class Buffer(val size: Int) {
|
|||||||
offset += (endIndex - startIndex)
|
offset += (endIndex - startIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun append(n: Int, order: ByteOrder = BIG_ENDIAN) {
|
fun append(n: Int, order: ByteOrder = ByteOrder.BIG_ENDIAN) {
|
||||||
n.copyInto(value, offset, order = order)
|
n.copyInto(value, offset, order = order)
|
||||||
offset += 4
|
offset += 4
|
||||||
}
|
}
|
||||||
|
|
||||||
fun append(n: Long, order: ByteOrder = BIG_ENDIAN) {
|
fun append(n: Long, order: ByteOrder = ByteOrder.BIG_ENDIAN) {
|
||||||
n.copyInto(value, offset, order = order)
|
n.copyInto(value, offset, order = order)
|
||||||
offset += 8
|
offset += 8
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
package com.infendro.hash
|
package com.infendro.hash
|
||||||
|
|
||||||
import com.infendro.hash.util.Buffer
|
|
||||||
|
|
||||||
abstract class HashFunction(
|
abstract class HashFunction(
|
||||||
val bytes: Int,
|
val bytes: Int,
|
||||||
val block: Int,
|
val block: Int,
|
||||||
@@ -9,8 +7,8 @@ abstract class HashFunction(
|
|||||||
val bits: Int
|
val bits: Int
|
||||||
get() = bytes * 8
|
get() = bytes * 8
|
||||||
|
|
||||||
internal val buffer = Buffer(block)
|
protected val buffer = Buffer(block)
|
||||||
internal var length = 0L
|
protected var length = 0L
|
||||||
|
|
||||||
open fun reset() {
|
open fun reset() {
|
||||||
buffer.reset()
|
buffer.reset()
|
||||||
@@ -29,28 +27,18 @@ abstract class HashFunction(
|
|||||||
open fun update(bytes: ByteArray) {
|
open fun update(bytes: ByteArray) {
|
||||||
var i = 0
|
var i = 0
|
||||||
|
|
||||||
// (partial) first block
|
var free = buffer.free
|
||||||
val free = buffer.free
|
while (i + free < bytes.size) {
|
||||||
if (i + free < bytes.size) {
|
|
||||||
buffer.append(bytes, startIndex = i, endIndex = i + free)
|
buffer.append(bytes, startIndex = i, endIndex = i + free)
|
||||||
length += free
|
length += free
|
||||||
process()
|
process()
|
||||||
buffer.reset()
|
buffer.reset()
|
||||||
i += free
|
free = buffer.free
|
||||||
}
|
|
||||||
|
|
||||||
// full blocks
|
|
||||||
while (i + block < bytes.size) {
|
|
||||||
buffer.append(bytes, startIndex = i, endIndex = i + block)
|
|
||||||
length += block
|
|
||||||
process()
|
|
||||||
buffer.reset()
|
|
||||||
i += block
|
i += block
|
||||||
}
|
}
|
||||||
|
|
||||||
// (partial) last block
|
|
||||||
buffer.append(bytes, startIndex = i)
|
buffer.append(bytes, startIndex = i)
|
||||||
length += bytes.size - i
|
length += (bytes.size - i)
|
||||||
if (buffer.isFull()) {
|
if (buffer.isFull()) {
|
||||||
process()
|
process()
|
||||||
buffer.reset()
|
buffer.reset()
|
||||||
|
|||||||
@@ -38,15 +38,21 @@ class Blake2b(bytes: Int) : HashFunction(bytes, 128) {
|
|||||||
process()
|
process()
|
||||||
buffer.reset()
|
buffer.reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
var i = 0
|
var i = 0
|
||||||
while (i + buffer.free < bytes.size) {
|
|
||||||
val remaining = buffer.free
|
var free = buffer.free
|
||||||
buffer.append(bytes, startIndex = i, endIndex = i + remaining)
|
while (i + free < bytes.size) {
|
||||||
|
buffer.append(bytes, startIndex = i, endIndex = i + free)
|
||||||
|
length += free
|
||||||
process()
|
process()
|
||||||
buffer.reset()
|
buffer.reset()
|
||||||
i += remaining
|
free = buffer.free
|
||||||
|
i += block
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer.append(bytes, startIndex = i)
|
buffer.append(bytes, startIndex = i)
|
||||||
|
length += (bytes.size - i)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun process() = compress(buffer.value, length, false)
|
override fun process() = compress(buffer.value, length, false)
|
||||||
|
|||||||
@@ -38,15 +38,21 @@ class Blake2s(bytes: Int) : HashFunction(bytes, 64) {
|
|||||||
process()
|
process()
|
||||||
buffer.reset()
|
buffer.reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
var i = 0
|
var i = 0
|
||||||
while (i + buffer.free < bytes.size) {
|
|
||||||
val remaining = buffer.free
|
var free = buffer.free
|
||||||
buffer.append(bytes, startIndex = i, endIndex = i + remaining)
|
while (i + free < bytes.size) {
|
||||||
|
buffer.append(bytes, startIndex = i, endIndex = i + free)
|
||||||
|
length += free
|
||||||
process()
|
process()
|
||||||
buffer.reset()
|
buffer.reset()
|
||||||
i += remaining
|
free = buffer.free
|
||||||
|
i += block
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer.append(bytes, startIndex = i)
|
buffer.append(bytes, startIndex = i)
|
||||||
|
length += (bytes.size - i)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun process() = compress(buffer.value, length, false)
|
override fun process() = compress(buffer.value, length, false)
|
||||||
|
|||||||
Reference in New Issue
Block a user