Compare commits
2 Commits
f4385d172e
...
633263c541
| Author | SHA1 | Date | |
|---|---|---|---|
|
633263c541
|
|||
|
ba1c983094
|
@@ -20,10 +20,16 @@ kotlin {
|
||||
|
||||
sourceSets {
|
||||
commonMain.dependencies {
|
||||
implementation(libs.hash)
|
||||
implementation(libs.random)
|
||||
implementation(libs.mac)
|
||||
implementation(libs.hash)
|
||||
implementation(libs.bytearray)
|
||||
}
|
||||
}
|
||||
|
||||
compilerOptions {
|
||||
freeCompilerArgs.add("-opt-in=kotlin.time.ExperimentalTime")
|
||||
}
|
||||
}
|
||||
|
||||
publishing {
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
[versions]
|
||||
kotlin = "2.1.20"
|
||||
hash = "1.1.0"
|
||||
mac = "1.1.0"
|
||||
random = "1.0.0"
|
||||
mac = "1.1.2"
|
||||
hash = "1.2.2"
|
||||
bytearray = "1.1.1"
|
||||
|
||||
[plugins]
|
||||
multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
|
||||
|
||||
[libraries]
|
||||
hash = { module = "com.infendro:hash", version.ref = "hash" }
|
||||
random = { module = "com.infendro:random", version.ref = "random" }
|
||||
mac = { module = "com.infendro:mac", version.ref = "mac" }
|
||||
hash = { module = "com.infendro:hash", version.ref = "hash" }
|
||||
bytearray = { module = "com.infendro:bytearray", version.ref = "bytearray" }
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package com.infendro.otp
|
||||
|
||||
import com.infendro.bytearray.toByteArray
|
||||
import com.infendro.bytearray.toInt
|
||||
import com.infendro.hash.HashFunction
|
||||
import com.infendro.hash.SHA1
|
||||
import com.infendro.mac.HMAC
|
||||
import com.infendro.otp.util.toByteArray
|
||||
import com.infendro.otp.util.toInt
|
||||
import kotlin.experimental.and
|
||||
import kotlin.math.pow
|
||||
|
||||
@@ -24,8 +24,7 @@ class HOTP(
|
||||
secret: ByteArray,
|
||||
counter: Long,
|
||||
): String {
|
||||
if (counter < 0)
|
||||
throw Exception()
|
||||
if (counter < 0) throw Exception()
|
||||
|
||||
val hash = generateHash(
|
||||
secret,
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package com.infendro.otp
|
||||
|
||||
import com.infendro.hash.*
|
||||
import kotlin.random.Random
|
||||
import com.infendro.random.PRNG
|
||||
|
||||
object SecretGenerator {
|
||||
private val random = Random.Default
|
||||
private val random = PRNG.HMAC
|
||||
|
||||
fun generate(
|
||||
algorithm: HashFunction = SHA1,
|
||||
|
||||
@@ -4,10 +4,8 @@ import com.infendro.hash.HashFunction
|
||||
import com.infendro.hash.SHA1
|
||||
import kotlin.time.Duration
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
import kotlin.time.ExperimentalTime
|
||||
import kotlin.time.Instant
|
||||
|
||||
@ExperimentalTime
|
||||
class TOTP(
|
||||
function: HashFunction = SHA1,
|
||||
length: Int = 6,
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
package com.infendro.otp.util
|
||||
|
||||
internal fun Long.toByteArray(): ByteArray {
|
||||
return ByteArray(8) { i ->
|
||||
val offset = (7 - i) * 8
|
||||
(this shr offset).toByte()
|
||||
}
|
||||
}
|
||||
|
||||
internal fun ByteArray.toInt(): Int {
|
||||
if (size != 4) throw Exception()
|
||||
|
||||
return fold(0) { acc, byte ->
|
||||
(acc shl 8) or (byte.toInt() and 0xFF)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun Collection<Byte>.toInt(): Int {
|
||||
return toByteArray().toInt()
|
||||
}
|
||||
Reference in New Issue
Block a user