This commit is contained in:
@@ -3,7 +3,7 @@ package com.infendro.hash.blake
|
|||||||
import com.infendro.bytes.intarray.copyInto
|
import com.infendro.bytes.intarray.copyInto
|
||||||
import com.infendro.bytes.ulong.copyInto
|
import com.infendro.bytes.ulong.copyInto
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceilPow2
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
object `Blake-224` : HashFunction {
|
object `Blake-224` : HashFunction {
|
||||||
override val bytes: Int
|
override val bytes: Int
|
||||||
@@ -37,7 +37,7 @@ object `Blake-224` : HashFunction {
|
|||||||
private fun pad(value: ByteArray): ByteArray {
|
private fun pad(value: ByteArray): ByteArray {
|
||||||
val length = value.size.toULong() * 8UL
|
val length = value.size.toULong() * 8UL
|
||||||
|
|
||||||
val size = ceilPow2(value.size + 9, block)
|
val size = (value.size + 9).align(block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
result[value.size] = 0x80U.toByte()
|
result[value.size] = 0x80U.toByte()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.infendro.bytes.bytearray.copyInto
|
|||||||
import com.infendro.bytes.intarray.copyInto
|
import com.infendro.bytes.intarray.copyInto
|
||||||
import com.infendro.bytes.ulong.copyInto
|
import com.infendro.bytes.ulong.copyInto
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceilPow2
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
object `Blake-256` : HashFunction {
|
object `Blake-256` : HashFunction {
|
||||||
override val bytes: Int
|
override val bytes: Int
|
||||||
@@ -62,7 +62,7 @@ object `Blake-256` : HashFunction {
|
|||||||
private fun pad(value: ByteArray): ByteArray {
|
private fun pad(value: ByteArray): ByteArray {
|
||||||
val length = value.size.toULong() * 8UL
|
val length = value.size.toULong() * 8UL
|
||||||
|
|
||||||
val size = ceilPow2(value.size + 10, block)
|
val size = (value.size + 10).align(block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
result[value.size] = 0x80U.toByte()
|
result[value.size] = 0x80U.toByte()
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package com.infendro.hash.blake
|
|||||||
import com.infendro.bytes.longarray.copyInto
|
import com.infendro.bytes.longarray.copyInto
|
||||||
import com.infendro.bytes.ulong.copyInto
|
import com.infendro.bytes.ulong.copyInto
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceilPow2
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
object `Blake-384` : HashFunction {
|
object `Blake-384` : HashFunction {
|
||||||
override val bytes: Int
|
override val bytes: Int
|
||||||
@@ -37,7 +37,7 @@ object `Blake-384` : HashFunction {
|
|||||||
private fun pad(value: ByteArray): ByteArray {
|
private fun pad(value: ByteArray): ByteArray {
|
||||||
val length = value.size.toULong() * 8UL
|
val length = value.size.toULong() * 8UL
|
||||||
|
|
||||||
val size = ceilPow2(value.size + 17, block)
|
val size = (value.size + 17).align(block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
result[value.size] = 0x80U.toByte()
|
result[value.size] = 0x80U.toByte()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.infendro.bytes.bytearray.copyInto
|
|||||||
import com.infendro.bytes.longarray.copyInto
|
import com.infendro.bytes.longarray.copyInto
|
||||||
import com.infendro.bytes.ulong.copyInto
|
import com.infendro.bytes.ulong.copyInto
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceilPow2
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
object `Blake-512` : HashFunction {
|
object `Blake-512` : HashFunction {
|
||||||
override val bytes: Int
|
override val bytes: Int
|
||||||
@@ -62,7 +62,7 @@ object `Blake-512` : HashFunction {
|
|||||||
private fun pad(value: ByteArray): ByteArray {
|
private fun pad(value: ByteArray): ByteArray {
|
||||||
val length = value.size.toULong() * 8UL
|
val length = value.size.toULong() * 8UL
|
||||||
|
|
||||||
val size = ceilPow2(value.size + 18, block)
|
val size = (value.size + 18).align(block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
result[value.size] = 0x80U.toByte()
|
result[value.size] = 0x80U.toByte()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.infendro.bytes.ByteOrder.LITTLE_ENDIAN
|
|||||||
import com.infendro.bytes.bytearray.copyInto
|
import com.infendro.bytes.bytearray.copyInto
|
||||||
import com.infendro.bytes.longarray.toByteArray
|
import com.infendro.bytes.longarray.toByteArray
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceilPow2
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
class Blake2b(
|
class Blake2b(
|
||||||
override val bytes: Int,
|
override val bytes: Int,
|
||||||
@@ -53,7 +53,7 @@ class Blake2b(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun pad(value: ByteArray): ByteArray {
|
private fun pad(value: ByteArray): ByteArray {
|
||||||
val size = maxOf(ceilPow2(value.size, block), block)
|
val size = maxOf(value.size.align(block), block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.infendro.bytes.ByteOrder.LITTLE_ENDIAN
|
|||||||
import com.infendro.bytes.bytearray.copyInto
|
import com.infendro.bytes.bytearray.copyInto
|
||||||
import com.infendro.bytes.intarray.toByteArray
|
import com.infendro.bytes.intarray.toByteArray
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceilPow2
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
class Blake2s(
|
class Blake2s(
|
||||||
override val bytes: Int,
|
override val bytes: Int,
|
||||||
@@ -53,7 +53,7 @@ class Blake2s(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun pad(value: ByteArray): ByteArray {
|
private fun pad(value: ByteArray): ByteArray {
|
||||||
val size = maxOf(ceilPow2(value.size, block), block)
|
val size = maxOf(value.size.align(block), block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.infendro.bytes.ByteOrder.LITTLE_ENDIAN
|
|||||||
import com.infendro.bytes.bytearray.copyInto
|
import com.infendro.bytes.bytearray.copyInto
|
||||||
import com.infendro.bytes.long.copyInto
|
import com.infendro.bytes.long.copyInto
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceil
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
open class Keccak(
|
open class Keccak(
|
||||||
override val bytes: Int,
|
override val bytes: Int,
|
||||||
@@ -52,7 +52,7 @@ open class Keccak(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun pad(value: ByteArray): ByteArray {
|
private fun pad(value: ByteArray): ByteArray {
|
||||||
val size = ceil(value.size + 2, block)
|
val size = (value.size + 2).align(block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
result[value.size] = domain
|
result[value.size] = domain
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import com.infendro.bytes.bytearray.copyInto
|
|||||||
import com.infendro.bytes.intarray.copyInto
|
import com.infendro.bytes.intarray.copyInto
|
||||||
import com.infendro.bytes.ulong.copyInto
|
import com.infendro.bytes.ulong.copyInto
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceilPow2
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
object MD5 : HashFunction {
|
object MD5 : HashFunction {
|
||||||
override val bytes: Int
|
override val bytes: Int
|
||||||
@@ -64,7 +64,7 @@ object MD5 : HashFunction {
|
|||||||
private fun pad(value: ByteArray): ByteArray {
|
private fun pad(value: ByteArray): ByteArray {
|
||||||
val length = value.size.toULong() * 8UL
|
val length = value.size.toULong() * 8UL
|
||||||
|
|
||||||
val size = ceilPow2(value.size + 9, block)
|
val size = (value.size + 9).align(block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
result[value.size] = 0x80U.toByte()
|
result[value.size] = 0x80U.toByte()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.infendro.bytes.bytearray.copyInto
|
|||||||
import com.infendro.bytes.intarray.copyInto
|
import com.infendro.bytes.intarray.copyInto
|
||||||
import com.infendro.bytes.ulong.copyInto
|
import com.infendro.bytes.ulong.copyInto
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceilPow2
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
object SHA1 : HashFunction {
|
object SHA1 : HashFunction {
|
||||||
override val bytes: Int
|
override val bytes: Int
|
||||||
@@ -39,7 +39,7 @@ object SHA1 : HashFunction {
|
|||||||
private fun pad(value: ByteArray): ByteArray {
|
private fun pad(value: ByteArray): ByteArray {
|
||||||
val length = value.size.toULong() * 8UL
|
val length = value.size.toULong() * 8UL
|
||||||
|
|
||||||
val size = ceilPow2(value.size + 9, block)
|
val size = (value.size + 9).align(block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
result[value.size] = 0x80U.toByte()
|
result[value.size] = 0x80U.toByte()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.infendro.bytes.bytearray.copyInto
|
|||||||
import com.infendro.bytes.intarray.copyInto
|
import com.infendro.bytes.intarray.copyInto
|
||||||
import com.infendro.bytes.ulong.copyInto
|
import com.infendro.bytes.ulong.copyInto
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceilPow2
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
object `SHA-256` : HashFunction {
|
object `SHA-256` : HashFunction {
|
||||||
override val bytes: Int
|
override val bytes: Int
|
||||||
@@ -46,7 +46,7 @@ object `SHA-256` : HashFunction {
|
|||||||
internal fun pad(value: ByteArray): ByteArray {
|
internal fun pad(value: ByteArray): ByteArray {
|
||||||
val length = value.size.toULong() * 8UL
|
val length = value.size.toULong() * 8UL
|
||||||
|
|
||||||
val size = ceilPow2(value.size + 9, block)
|
val size = (value.size + 9).align(block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
result[value.size] = 0x80U.toByte()
|
result[value.size] = 0x80U.toByte()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.infendro.bytes.bytearray.copyInto
|
|||||||
import com.infendro.bytes.longarray.copyInto
|
import com.infendro.bytes.longarray.copyInto
|
||||||
import com.infendro.bytes.ulong.copyInto
|
import com.infendro.bytes.ulong.copyInto
|
||||||
import com.infendro.hash.HashFunction
|
import com.infendro.hash.HashFunction
|
||||||
import com.infendro.hash.util.ceilPow2
|
import com.infendro.hash.util.align
|
||||||
|
|
||||||
object `SHA-512` : HashFunction {
|
object `SHA-512` : HashFunction {
|
||||||
override val bytes: Int
|
override val bytes: Int
|
||||||
@@ -58,7 +58,7 @@ object `SHA-512` : HashFunction {
|
|||||||
internal fun pad(value: ByteArray): ByteArray {
|
internal fun pad(value: ByteArray): ByteArray {
|
||||||
val length = value.size.toULong() * 8UL
|
val length = value.size.toULong() * 8UL
|
||||||
|
|
||||||
val size = ceilPow2(value.size + 17, block)
|
val size = (value.size + 17).align(block)
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
value.copyInto(result)
|
value.copyInto(result)
|
||||||
result[value.size] = 0x80U.toByte()
|
result[value.size] = 0x80U.toByte()
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.infendro.hash.util
|
package com.infendro.hash.util
|
||||||
|
|
||||||
internal fun ceil(x: Int, n: Int): Int =
|
internal fun Int.align(n: Int): Int = when {
|
||||||
((x + n - 1) / n) * n
|
n and (n - 1) == 0 -> (this + n - 1) and (n - 1).inv()
|
||||||
|
else -> ((this + n - 1) / n) * n
|
||||||
internal fun ceilPow2(x: Int, n: Int): Int =
|
}
|
||||||
(x + n - 1) and (n - 1).inv()
|
|
||||||
|
|||||||
Reference in New Issue
Block a user