KeccakKotlin
2.1.1indexedImplements SHA-3 hash functions, offering standard API, HashInputStream, HashOutputStream, and derived hash functions like cSHAKE and KMAC. Extends capabilities with byte streamable and extendable functions.
Implements SHA-3 hash functions, offering standard API, HashInputStream, HashOutputStream, and derived hash functions like cSHAKE and KMAC. Extends capabilities with byte streamable and extendable functions.
Digital security for all, everywhere, no matter who they are, or what they believe in.
This is a 100% Kotlin Multiplatform implementation of SHA-3. It does not depend on any third-party library.
This is used in KyberKotlin, an ML-KEM implemention of NIST FIPS 203.
[!NOTE] These hash functions will be gradually implemented.
ParallelHash Functions might need to add coroutine as a dependency.
*Note: Some platforms are unavailable/deprecated as targets in Kotlin Multiplatform. Please send your complaints to Jetbrains.
**These targets are currently available, but I have no ability to compile them yet. Once I have more free time, I will set up a publishing server to compile to all targets.
Maven/Gradle
dependencies {
implementation("asia.hombre:keccak:2.1.1")
}
View the java example here!
Copyright 2025 Ron Lauren Hombre
Licensed under the Apache License, Version (the );
you may use except compliance the License.
You may obtain a copy of the License at
https:
included LICENSE.txt Project.
Unless applicable law agreed to writing, software
distributed under the License distributed an BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express implied.
See the License the specific language governing permissions
limitations under the License.
Although SHA-3 is Public Domain, this implementation is created through Hard Work by its Contributors. Thus, the APACHE LICENSE v2.0 has been chosen.
| Target | Arm32 | Arm64 | X64 |
|---|
| JVM (Kotlin & Java) | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| JS (Node, Bun, & Browser) | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| Linux | :x: * | :x: ** | :white_check_mark: |
| Windows (Mingw) | :x: * | :x: * | :white_check_mark: |
| Android | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| iOS | :x: * | :x: ** | :x: ** |
| iOS Simulator | :x: * | :x: ** | :x: * |
val sha3_224 = SHA3_224().digest()
println(sha3_224.toHexString(HexFormat.UpperCase))
val sha3_256 = SHA3_256().digest()
println(sha3_256.toHexString(HexFormat.UpperCase))
val sha3_384 = SHA3_384().digest()
println(sha3_384.toHexString(HexFormat.UpperCase))
val sha3_512 = SHA3_512().digest()
println(sha3_512.toHexString(HexFormat.UpperCase))
val kmac_128 = KMAC128("key".encodeToByteArray(), 32).digest()
println(kmac_128.toHexString(HexFormat.UpperCase))
val kmac_256 = KMAC256("key".encodeToByteArray(), 64).digest()
println(kmac_256.toHexString(HexFormat.UpperCase))
//Extendable-Output Functions
val rawshake_128 = RawSHAKE128().digest()
println(rawshake_128.toHexString(HexFormat.UpperCase))
val rawshake_256 = RawSHAKE256().digest()
println(rawshake_256.toHexString(HexFormat.UpperCase))
val shake_128 = SHAKE128().digest()
println(shake_128.toHexString(HexFormat.UpperCase))
val shake_256 = SHAKE256().digest()
println(shake_256.toHexString(HexFormat.UpperCase))
val cshake_128 = cSHAKE128().digest()
println(cshake_128.toHexString(HexFormat.UpperCase))
val cshake_256 = cSHAKE256().digest()
println(cshake_256.toHexString(HexFormat.UpperCase))
val kmacxof_128 = KMACXOF128("key".encodeToByteArray()).digest()
println(kmacxof_128.toHexString(HexFormat.UpperCase))
val kmacxof_256 = KMACXOF256("key".encodeToByteArray()).digest()
println(kmacxof_256.toHexString(HexFormat.UpperCase))
//Input Streaming
val shake128_in = SHAKE128.newInputStream()
shake128_in.write("Hello!".encodeToByteArray())
//Output Streaming
val shake128_out = shake128_in.close()
println(shake128_out.nextBytes(1024).toHexString(HexFormat.UpperCase))
Surfaced from shared tags and platforms — no rankings paid for.