KeccakKotlin

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.

JVM
iOS
Android Native
Linux
Windows
JS
GitHub stars6
Authorsronhombre
Dependents1
LicenseApache License 2.0
Creation dateover 2 years ago

Last activity9 days ago
Latest release2.5.0 (9 days ago)

KeccakKotlin (2.5.0)

Implements SHA-3 Hash Functions

Digital security for all, everywhere, no matter who they are, or what they believe in.

Maven Central GitHub license Gradle Kotlin Java Linux Arm64 & X64 Windows X64 iOS Arm64 & X64 Android Arm32, Arm64, & X64

Introduction

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] 2.5.0 features another round of optimizations! When profiled with KyberKotlin's JVMBenchmark, the memory allocations started from 52.19GB and dropped to 38.17GB. That's a 26.86% reduction!

[!NOTE] 2.3.0 is a maintenance release. It is essentially 2.1.1 but additionally supports linuxArm64, iosX64, iosArm64, and iosSimulatorArm64 as well as Kotlin 2.4.20 and Gradle 9.7.1.

[!WARNING] 2.3.0 and 2.4.0-alpha broke binary compatibility with Java <21. 2.5.0 restores compatibility to Java 8.

Capabilities (NIST FIPS 202)

  • SHA3-224 (Byte Stream-able)
  • SHA3-256 (Byte Stream-able)
  • SHA3-384 (Byte Stream-able)
  • SHA3-512 (Byte Stream-able)
  • RawSHAKE128 (Extendable, Byte Stream-able)
  • RawSHAKE256 (Extendable, Byte Stream-able)
  • SHAKE128 (Extendable, Byte Stream-able)
  • SHAKE256 (Extendable, Byte Stream-able)

Extended Capabilities / SHA-3 Derived Functions (NIST SP 800-185)

  • cSHAKE128 (Extendable, Byte Stream-able)
  • cSHAKE256 (Extendable, Byte Stream-able)
  • KMAC128 (Byte Stream-able)
  • KMAC256 (Byte Stream-able)
  • KMACXOF128 (Extendable, Byte Stream-able)
  • KMACXOF256 (Extendable, Byte Stream-able)

To Be Supported

[!NOTE] These hash functions will be gradually implemented.

  • TupleHash128 (Byte Stream-able)
  • TupleHash256 (Byte Stream-able)
  • TupleHashXOF128 (Extendable, Byte Stream-able)
  • TupleHashXOF256 (Extendable, Byte Stream-able)
  • ParallelHash128 (Byte Stream-able)
  • ParallelHash256 (Byte Stream-able)
  • ParallelHashXOF128 (Extendable, Byte Stream-able)
  • ParallelHashXOF256 (Extendable, Byte Stream-able)

ParallelHash Functions might need to add coroutine as a dependency.

Supported and Tested Targets

Target Arm32 Arm64 X64
JVM (Kotlin & Java) ✅ ✅ ✅
JS (Node, Bun, & Browser)** ✅ ✅ ✅
Linux ❌ * ✅ ✅
Windows (Mingw) ❌ * ❌ * ✅
Android ✅ ✅ ✅
iOS ❌ * ✅ ✅
iOS Simulator ❌ * ✅ ❌ *

*Note: Some platforms are unavailable/deprecated as targets in Kotlin Multiplatform. Please send your complaints to Jetbrains.

**JS is not tested on its own. Rather, its correctness is proven by the other tested targets.

Installation

Maven/Gradle

dependencies {
    implementation("asia.hombre:keccak:2.5.0")
}

See more installation instructions here.

Usage

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))

View the java example here!

Documentation

References

License

Copyright 2026 Ron Lauren Hombre

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

       https://www.apache.org/licenses/LICENSE-2.0
       
       and included as LICENSE.txt in this Project.

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
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.

JVM
iOS
Android Native
Linux
Windows
JS
GitHub stars6
Authorsronhombre
Dependents1
LicenseApache License 2.0
Creation dateover 2 years ago

Last activity9 days ago
Latest release2.5.0 (9 days ago)

KeccakKotlin (2.5.0)

Implements SHA-3 Hash Functions

Digital security for all, everywhere, no matter who they are, or what they believe in.

Maven Central GitHub license Gradle Kotlin Java Linux Arm64 & X64 Windows X64 iOS Arm64 & X64 Android Arm32, Arm64, & X64

Introduction

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] 2.5.0 features another round of optimizations! When profiled with KyberKotlin's JVMBenchmark, the memory allocations started from 52.19GB and dropped to 38.17GB. That's a 26.86% reduction!

[!NOTE] 2.3.0 is a maintenance release. It is essentially 2.1.1 but additionally supports linuxArm64, iosX64, iosArm64, and iosSimulatorArm64 as well as Kotlin 2.4.20 and Gradle 9.7.1.

[!WARNING] 2.3.0 and 2.4.0-alpha broke binary compatibility with Java <21. 2.5.0 restores compatibility to Java 8.

Capabilities (NIST FIPS 202)

  • SHA3-224 (Byte Stream-able)
  • SHA3-256 (Byte Stream-able)
  • SHA3-384 (Byte Stream-able)
  • SHA3-512 (Byte Stream-able)
  • RawSHAKE128 (Extendable, Byte Stream-able)
  • RawSHAKE256 (Extendable, Byte Stream-able)
  • SHAKE128 (Extendable, Byte Stream-able)
  • SHAKE256 (Extendable, Byte Stream-able)

Extended Capabilities / SHA-3 Derived Functions (NIST SP 800-185)

  • cSHAKE128 (Extendable, Byte Stream-able)
  • cSHAKE256 (Extendable, Byte Stream-able)
  • KMAC128 (Byte Stream-able)
  • KMAC256 (Byte Stream-able)
  • KMACXOF128 (Extendable, Byte Stream-able)
  • KMACXOF256 (Extendable, Byte Stream-able)

To Be Supported

[!NOTE] These hash functions will be gradually implemented.

  • TupleHash128 (Byte Stream-able)
  • TupleHash256 (Byte Stream-able)
  • TupleHashXOF128 (Extendable, Byte Stream-able)
  • TupleHashXOF256 (Extendable, Byte Stream-able)
  • ParallelHash128 (Byte Stream-able)
  • ParallelHash256 (Byte Stream-able)
  • ParallelHashXOF128 (Extendable, Byte Stream-able)
  • ParallelHashXOF256 (Extendable, Byte Stream-able)

ParallelHash Functions might need to add coroutine as a dependency.

Supported and Tested Targets

Target Arm32 Arm64 X64
JVM (Kotlin & Java) ✅ ✅ ✅
JS (Node, Bun, & Browser)** ✅ ✅ ✅
Linux ❌ * ✅ ✅
Windows (Mingw) ❌ * ❌ * ✅
Android ✅ ✅ ✅
iOS ❌ * ✅ ✅
iOS Simulator ❌ * ✅ ❌ *

*Note: Some platforms are unavailable/deprecated as targets in Kotlin Multiplatform. Please send your complaints to Jetbrains.

**JS is not tested on its own. Rather, its correctness is proven by the other tested targets.

Installation

Maven/Gradle

dependencies {
    implementation("asia.hombre:keccak:2.5.0")
}

See more installation instructions here.

Usage

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))

View the java example here!

Documentation

References

License

Copyright 2026 Ron Lauren Hombre

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

       https://www.apache.org/licenses/LICENSE-2.0
       
       and included as LICENSE.txt in this Project.

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
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.