Skip to content

Commit 1c03ecd

Browse files
authored
Add Api key verifier.
* Add Api key verifier.
1 parent 9c87faf commit 1c03ecd

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package no.nav.dagpenger.ktor.auth
2+
3+
import javax.crypto.Mac
4+
import javax.crypto.spec.SecretKeySpec
5+
6+
class ApiKeyVerifier(private val secret: ByteArray) {
7+
8+
private val algorithm = "HmacSHA256"
9+
10+
fun verify(apiKey: ByteArray, expectedApiKey: ByteArray): Boolean {
11+
12+
val hmac = generate(apiKey)
13+
14+
if (hmac.size != expectedApiKey.size) return false
15+
var result = 0
16+
for (i in 0 until hmac.size) {
17+
result = result.or(hmac[i].toInt().xor(expectedApiKey[i].toInt()))
18+
}
19+
20+
return result == 0
21+
}
22+
23+
fun generate(apiKey: ByteArray): ByteArray {
24+
val keySpec = SecretKeySpec(secret, algorithm)
25+
val mac = Mac.getInstance(algorithm)
26+
mac.init(keySpec)
27+
28+
val hmac = mac.doFinal(apiKey)
29+
return hmac
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package no.nav.dagpenger.ktor.auth
2+
3+
import org.junit.jupiter.api.Test
4+
import kotlin.test.assertFalse
5+
import kotlin.test.assertTrue
6+
7+
internal class ApiKeyVerifierTest {
8+
9+
@Test
10+
fun `Should be able to verify api key with same secret`() {
11+
val verifier = ApiKeyVerifier("secret".toByteArray())
12+
val enc = verifier.generate("apikey".toByteArray())
13+
assertTrue { verifier.verify("apikey".toByteArray(), enc) }
14+
}
15+
16+
@Test
17+
fun `Should not be able to verify api if key has changed key with same secret`() {
18+
val verifier = ApiKeyVerifier("secret".toByteArray())
19+
val enc = verifier.generate("apikey".toByteArray())
20+
assertFalse { verifier.verify("Apikey".toByteArray(), enc) }
21+
}
22+
23+
@Test
24+
fun `Should not be able to verify api if with secret changed`() {
25+
val generator = ApiKeyVerifier("another secret".toByteArray())
26+
val enc = generator.generate("apikey".toByteArray())
27+
val verifier = ApiKeyVerifier("secret".toByteArray())
28+
assertFalse { verifier.verify("apikey".toByteArray(), enc) }
29+
}
30+
}

0 commit comments

Comments
 (0)