Compare commits
2 Commits
89e7569fa7
...
2ae6fda70e
| Author | SHA1 | Date | |
|---|---|---|---|
|
2ae6fda70e
|
|||
|
2c6fe0a7d9
|
@@ -6,7 +6,7 @@ import com.infendro.mac.HMAC
|
|||||||
import com.infendro.random.CSPRNG
|
import com.infendro.random.CSPRNG
|
||||||
import kotlin.properties.Delegates.notNull
|
import kotlin.properties.Delegates.notNull
|
||||||
|
|
||||||
class `HMAC-DRBG` internal constructor(
|
class `HMAC-DRBG`(
|
||||||
private val function: HashFunction,
|
private val function: HashFunction,
|
||||||
) : CSPRNG() {
|
) : CSPRNG() {
|
||||||
private val hmac = HMAC(function)
|
private val hmac = HMAC(function)
|
||||||
@@ -14,6 +14,8 @@ class `HMAC-DRBG` internal constructor(
|
|||||||
private var k: ByteArray by notNull()
|
private var k: ByteArray by notNull()
|
||||||
private var v: ByteArray by notNull()
|
private var v: ByteArray by notNull()
|
||||||
|
|
||||||
|
private val buffer = ByteArray(function.bytes + 1)
|
||||||
|
|
||||||
override fun seed(seed: ByteArray) {
|
override fun seed(seed: ByteArray) {
|
||||||
k = ByteArray(function.bytes) { 0x00 }
|
k = ByteArray(function.bytes) { 0x00 }
|
||||||
v = ByteArray(function.bytes) { 0x01 }
|
v = ByteArray(function.bytes) { 0x01 }
|
||||||
@@ -21,17 +23,28 @@ class `HMAC-DRBG` internal constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun reseed(entropy: ByteArray) {
|
override fun reseed(entropy: ByteArray) {
|
||||||
k = hmac.hash(k, v + byteArrayOf(0x00) + entropy)
|
val value = ByteArray(v.size + 1 + entropy.size)
|
||||||
v = hmac.hash(k, v)
|
|
||||||
k = hmac.hash(k, v + byteArrayOf(0x01) + entropy)
|
v.copyInto(value)
|
||||||
v = hmac.hash(k, v)
|
value[v.size] = 0x00
|
||||||
|
entropy.copyInto(value, v.size + 1)
|
||||||
|
hmac.hashInto(k, value, k)
|
||||||
|
hmac.hashInto(k, v, v)
|
||||||
|
|
||||||
|
value[v.size] = 0x01
|
||||||
|
hmac.hashInto(k, value, k)
|
||||||
|
hmac.hashInto(k, v, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun generate(): Int {
|
override fun generate(): Int {
|
||||||
v = hmac.hash(k, v)
|
hmac.hashInto(k, v, v)
|
||||||
val result = v.toInt()
|
val result = v.toInt()
|
||||||
k = hmac.hash(k, v + byteArrayOf(0x00))
|
|
||||||
v = hmac.hash(k, v)
|
v.copyInto(buffer)
|
||||||
|
buffer[v.size] = 0x00
|
||||||
|
hmac.hashInto(k, buffer, k)
|
||||||
|
hmac.hashInto(k, v, v)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import com.infendro.hash.sha2.`SHA-256`
|
|||||||
import com.infendro.random.PRNG
|
import com.infendro.random.PRNG
|
||||||
import kotlin.properties.Delegates.notNull
|
import kotlin.properties.Delegates.notNull
|
||||||
|
|
||||||
class LCG internal constructor() : PRNG() {
|
class LCG : PRNG() {
|
||||||
private val a: Long = 25214903917L
|
private val a: Long = 25214903917L
|
||||||
private val c: Long = 11L
|
private val c: Long = 11L
|
||||||
private val mask: Long = (1L shl 48) - 1
|
private val mask: Long = (1L shl 48) - 1
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.infendro.random.prng
|
||||||
|
|
||||||
|
import com.infendro.bytes.bytearray.toLongArray
|
||||||
|
import com.infendro.hash.sha2.`SHA-256`
|
||||||
|
import com.infendro.random.PRNG
|
||||||
|
import kotlin.properties.Delegates.notNull
|
||||||
|
|
||||||
|
class Xoshiro256pp : PRNG() {
|
||||||
|
private var s: LongArray by notNull()
|
||||||
|
|
||||||
|
override fun seed(seed: ByteArray) {
|
||||||
|
s = `SHA-256`.hash(seed).toLongArray()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun generate(): Int {
|
||||||
|
val result = (s[0] + s[3]).rotateLeft(23) + s[0]
|
||||||
|
|
||||||
|
val t = s[1] shl 17
|
||||||
|
s[2] = s[2] xor s[0]
|
||||||
|
s[3] = s[3] xor s[1]
|
||||||
|
s[1] = s[1] xor s[2]
|
||||||
|
s[0] = s[0] xor s[3]
|
||||||
|
s[2] = s[2] xor t
|
||||||
|
s[3] = s[3].rotateLeft(45)
|
||||||
|
|
||||||
|
return (result ushr 32).toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.infendro.random.prng
|
||||||
|
|
||||||
|
import com.infendro.bytes.bytearray.toLongArray
|
||||||
|
import com.infendro.hash.sha2.`SHA-256`
|
||||||
|
import com.infendro.random.PRNG
|
||||||
|
import kotlin.properties.Delegates.notNull
|
||||||
|
|
||||||
|
class Xoshiro256ss : PRNG() {
|
||||||
|
private var s: LongArray by notNull()
|
||||||
|
|
||||||
|
override fun seed(seed: ByteArray) {
|
||||||
|
s = `SHA-256`.hash(seed).toLongArray()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun generate(): Int {
|
||||||
|
val result = (s[1] * 5).rotateLeft(7) * 9
|
||||||
|
|
||||||
|
val t = s[1] shl 17
|
||||||
|
s[2] = s[2] xor s[0]
|
||||||
|
s[3] = s[3] xor s[1]
|
||||||
|
s[1] = s[1] xor s[2]
|
||||||
|
s[0] = s[0] xor s[3]
|
||||||
|
s[2] = s[2] xor t
|
||||||
|
s[3] = s[3].rotateLeft(45)
|
||||||
|
|
||||||
|
return (result ushr 32).toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user