13 val DEFAULT_TYPE: Argon2Types = Argon2Types.ARGON2id
15 const val DEFAULT_ITERATIONS = 2
16 const val DEFAULT_MEMORY = 65536
18 val DEFAULT_PARALLELISM = Runtime.getRuntime().availableProcessors()
20 private val threadLocal2i = ThreadLocal.withInitial {
21 Argon2Factory.create(Argon2Types.ARGON2i)
24 private val threadLocal2d = ThreadLocal.withInitial {
25 Argon2Factory.create(Argon2Types.ARGON2d)
28 private val threadLocal2id = ThreadLocal.withInitial {
29 Argon2Factory.create(Argon2Types.ARGON2id)
33 fun get2i(): Argon2 = threadLocal2i.get()
36 fun get2d(): Argon2 = threadLocal2d.get()
39 fun get2id(): Argon2 = threadLocal2id.get()
42 fun forType(argon2Types: Argon2Types) = when (argon2Types) {
43 Argon2Types.ARGON2d -> get2d()
44 Argon2Types.ARGON2i -> get2i()
45 Argon2Types.ARGON2id -> get2id()
46 else -> throw UnsupportedOperationException()
50 fun getDefault(): Argon2 = forType(DEFAULT_TYPE)
53 fun argon2Type(password: String): Argon2Types? = when {
54 password.startsWith("\$argon2id\$") -> Argon2Types.ARGON2id
55 password.startsWith("\$argon2i\$") -> Argon2Types.ARGON2i
56 password.startsWith("\$argon2d\$") -> Argon2Types.ARGON2d
61 fun forHash(hash: String) = forType(
62 argon2Type(hash) ?: throw UnsupportedOperationException("Could not determine type for hash \"$hash\"")