|
@@ -94,34 +94,29 @@ internal class ScramMechanism(private val algorithm: String, override val priori
|
94
|
94
|
sendAuthenticationMessage("*")
|
95
|
95
|
}
|
96
|
96
|
|
97
|
|
- private fun IrcClient.sendScramMessage(prefix: String = "", vararg entries: Pair<ScramMessageType, String>) =
|
98
|
|
- sendAuthenticationData("$prefix${buildScramMessage(*entries)}")
|
99
|
|
-
|
100
|
|
- private fun buildScramMessage(vararg entries: Pair<ScramMessageType, String>) = entries.joinToString(",") { (k, v) -> "${k.prefix}=$v" }
|
101
|
|
-
|
102
|
|
- private fun ByteArray?.parse(): Map<ScramMessageType, String> {
|
103
|
|
- return if (this == null || this.isEmpty())
|
104
|
|
- emptyMap()
|
105
|
|
- else
|
106
|
|
- String(this).split(',').map {
|
107
|
|
- getMessageType(it[0]) to it.substring(2).unescape()
|
108
|
|
- }.toMap()
|
109
|
|
- }
|
|
97
|
+ private fun IrcClient.sendScramMessage(prefix: String = "", vararg entries: Pair<ScramMessageType, String>)
|
|
98
|
+ = sendAuthenticationData("$prefix${buildScramMessage(*entries)}")
|
|
99
|
+
|
|
100
|
+ private fun buildScramMessage(vararg entries: Pair<ScramMessageType, String>)
|
|
101
|
+ = entries.joinToString(",") { (k, v) -> "${k.prefix}=$v" }
|
|
102
|
+
|
|
103
|
+ private fun ByteArray?.parse() = if (this == null || this.isEmpty())
|
|
104
|
+ emptyMap()
|
|
105
|
+ else
|
|
106
|
+ String(this).split(',').map {
|
|
107
|
+ getMessageType(it[0]) to it.substring(2).unescape()
|
|
108
|
+ }.toMap()
|
110
|
109
|
|
111
|
110
|
private fun String.escape() = replace("=", "=3D").replace(",", "=2C")
|
112
|
111
|
private fun String.unescape() = replace("=2C", ",").replace("=3D", "=")
|
113
|
112
|
|
114
|
|
- private fun hmac(keyMaterial: ByteArray, input: ByteArray): ByteArray {
|
115
|
|
- return with(Mac.getInstance("hmac${algorithm.replace("-", "")}")) {
|
116
|
|
- init(SecretKeySpec(keyMaterial, algorithm))
|
117
|
|
- doFinal(input)
|
118
|
|
- }
|
|
113
|
+ private fun hmac(keyMaterial: ByteArray, input: ByteArray) = with(Mac.getInstance("hmac${algorithm.replace("-", "")}")) {
|
|
114
|
+ init(SecretKeySpec(keyMaterial, algorithm))
|
|
115
|
+ doFinal(input)
|
119
|
116
|
}
|
120
|
117
|
|
121
|
|
- private fun hash(input: ByteArray): ByteArray {
|
122
|
|
- return with(MessageDigest.getInstance(algorithm.replace("-", ""))) {
|
123
|
|
- digest(input)
|
124
|
|
- }
|
|
118
|
+ private fun hash(input: ByteArray) = with(MessageDigest.getInstance(algorithm.replace("-", ""))) {
|
|
119
|
+ digest(input)
|
125
|
120
|
}
|
126
|
121
|
|
127
|
122
|
private fun pbkdf2(keyMaterial: ByteArray, initialSalt: ByteArray, iterations: Int): ByteArray {
|
|
@@ -150,7 +145,7 @@ private class ScramException(message: String) : RuntimeException(message)
|
150
|
145
|
private fun newNonce(): String {
|
151
|
146
|
val charPool: List<Char> = (' '..'~') - ',' - '='
|
152
|
147
|
val random = SecureRandom.getInstanceStrong().asKotlinRandom()
|
153
|
|
- return (0..31).map { charPool.random(random) }.joinToString("")
|
|
148
|
+ return CharArray(32) { charPool.random(random) }.joinToString("")
|
154
|
149
|
}
|
155
|
150
|
|
156
|
151
|
internal class ScramState(
|