KyberKotlin

ML-KEM's Kotlin Implementation

APACHE-2.0 License

Stars
3

Bot releases are visible (Hide)

KyberKotlin - v0.2.6

Published by ronhombre 9 months ago

UNOPTIMIZED VERSION

Changelog:

  • Improved library encapsulation. Hidden internal functions.
  • Sealed interfaces.
  • Properly set constant values as Inlines.

Platforms:

  • JVM

Features:

  • ML-KEM Key Generation(512, 768, 1024)
  • ML-KEM Encapsulation(512, 768, 1024)
  • ML-KEM Decapsulation(512, 768, 1024)

Usage:

JVM

Kotlin

val aliceKeys = KyberKeyGenerator.generate(KyberParameter.ML_KEM_512)
val bobKeys = KyberKeyGenerator.generate(KyberParameter.ML_KEM_512)

val aliceAgreement = KyberAgreement(aliceKeys)
val bobAgreement = KyberAgreement(bobKeys)

val encapsResult = aliceAgreement.encapsulate(bobAgreement.keypair.encapsulationKey)

val decapsSecretKey = bobAgreement.decapsulate(encapsResult.cipherText)

println(encapsResult.secretKey.contentToString())
println(decapsSecretKey.contentToString())

Java

KyberKEMKeyPair aliceKeys = KyberKeyGenerator.generate(KyberParameter.ML_KEM_512);
KyberKEMKeyPair bobKeys = KyberKeyGenerator.generate(KyberParameter.ML_KEM_512);

KyberAgreement aliceAgreement = new KyberAgreement(aliceKeys);
KyberAgreement bobAgreement = new KyberAgreement(bobKeys);

KyberEncapsulationResult encapsResult = aliceAgreement.encapsulate(bobAgreement.getKeypair().getEncapsulationKey());

byte[] decapsSecretKey = bobAgreement.decapsulate(encapsResult.getCipherText());

System.out.println(Arrays.toString(encapsResult.getSecretKey()));
System.out.println(Arrays.toString(decapsSecretKey));

Output:
[1, -123, 89, 94, -70, -97, -54, -58, -82, -10, -92, 10, -85, 115, -61, 85, 33, -109, 66, 71, -76, 86, -19, -37, 28, 66, 56, 72, -101, -56, -58, 22]
[1, -123, 89, 94, -70, -97, -54, -58, -82, -10, -92, 10, -85, 115, -61, 85, 33, -109, 66, 71, -76, 86, -19, -37, 28, 66, 56, 72, -101, -56, -58, 22]

Import as Dependency:

JAR JVM

dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
}

Add to libs/ folder

Maven JVM

dependencies {
    implementation("asia.hombre:kyber:0.2.6")
}
KyberKotlin - v0.2.5

Published by ronhombre 9 months ago

UNOPTIMIZED VERSION

Changelog:

  • Use native SecureRandom() for JVM.
  • Added JVM-specific Benchmarks.
  • Made Key Generation static. No need to instantiate.
  • Compiled with Java 1.8.
  • Made KeyAgreement.kt and KyberKeyPairGenerator.kt internal.
  • Added KDocs for KeyAgreement.
  • Updated benchmarks.

Platforms:

  • JVM

Features:

  • ML-KEM Key Generation(512, 768, 1024)
  • ML-KEM Encapsulation(512, 768, 1024)
  • ML-KEM Decapsulation(512, 768, 1024)

Usage:

JVM

val aliceKeys = KyberKeyGenerator.generate(KyberParameter.ML_KEM_512)
val bobKeys = KyberKeyGenerator.generate(KyberParameter.ML_KEM_512)

val aliceAgreement = KyberAgreement(aliceKeys)
val bobAgreement = KyberAgreement(bobKeys)

val encapsResult = aliceAgreement.encapsulate(bobAgreement.keypair.encapsulationKey)

val decapsSecretKey = bobAgreement.decapsulate(encapsResult.cipherText)

println(encapsResult.secretKey.contentToString())
println(decapsSecretKey.contentToString())

Output:
[1, -123, 89, 94, -70, -97, -54, -58, -82, -10, -92, 10, -85, 115, -61, 85, 33, -109, 66, 71, -76, 86, -19, -37, 28, 66, 56, 72, -101, -56, -58, 22]
[1, -123, 89, 94, -70, -97, -54, -58, -82, -10, -92, 10, -85, 115, -61, 85, 33, -109, 66, 71, -76, 86, -19, -37, 28, 66, 56, 72, -101, -56, -58, 22]

Import as Dependency:

JAR JVM

dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
}

Add to libs/ folder

Maven JVM

dependencies {
    implementation("asia.hombre:kyber:0.2.5")
}
KyberKotlin - v0.2.4

Published by ronhombre 9 months ago

DEVELOPER+UNOPTIMIZED VERSION

Virtually identical with v0.2.3.

Changelog:

  • Cleaned up and formatted code.
  • Optimized minor code.
  • Made KyberParameter the central basis for the lengths of ciphertext, encaps key, and decaps key.
  • Gradle jvmJar.
  • Added warning for use of internal/SecureRandom.

Platforms:

  • JVM

Features:

  • ML-KEM Key Generation(512, 768, 1024)
  • ML-KEM Encapsulation(512, 768, 1024)
  • ML-KEM Decapsulation(512, 768, 1024)

Usage:

JVM

val aliceKeys = KyberKeyPairGenerator().generate(KyberParameter.ML_KEM_512)
val bobKeys = KyberKeyPairGenerator().generate(KyberParameter.ML_KEM_512)

val aliceAgreement = KeyAgreement(aliceKeys)
val bobAgreement = KeyAgreement(bobKeys)

val encapsResult = aliceAgreement.encapsulate(bobAgreement.keypair.encapsulationKey)

val decapsSecretKey = bobAgreement.decapsulate(encapsResult.cipherText)

println(encapsResult.secretKey.contentToString())
println(decapsSecretKey.contentToString())

Output:
[1, -123, 89, 94, -70, -97, -54, -58, -82, -10, -92, 10, -85, 115, -61, 85, 33, -109, 66, 71, -76, 86, -19, -37, 28, 66, 56, 72, -101, -56, -58, 22]
[1, -123, 89, 94, -70, -97, -54, -58, -82, -10, -92, 10, -85, 115, -61, 85, 33, -109, 66, 71, -76, 86, -19, -37, 28, 66, 56, 72, -101, -56, -58, 22]

Import as Dependency:

JVM

dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
}

Add to libs/ folder

KyberKotlin - v0.2.3

Published by ronhombre 9 months ago

DEVELOPER+UNOPTIMIZED VERSION

Platforms:

  • JVM

Features:

  • ML-KEM Key Generation(512, 768, 1024)
  • ML-KEM Encapsulation(512, 768, 1024)
  • ML-KEM Decapsulation(512, 768, 1024)

Usage:

JVM

val aliceKeys = KyberKeyPairGenerator().generate(KyberParameter.ML_KEM_512)
val bobKeys = KyberKeyPairGenerator().generate(KyberParameter.ML_KEM_512)

val aliceAgreement = KeyAgreement(aliceKeys)
val bobAgreement = KeyAgreement(bobKeys)

val encapsResult = aliceAgreement.encapsulate(bobAgreement.keypair.encapsulationKey)

val decapsSecretKey = bobAgreement.decapsulate(encapsResult.cipherText)

println(encapsResult.secretKey.contentToString())
println(decapsSecretKey.contentToString())

Output:
[1, -123, 89, 94, -70, -97, -54, -58, -82, -10, -92, 10, -85, 115, -61, 85, 33, -109, 66, 71, -76, 86, -19, -37, 28, 66, 56, 72, -101, -56, -58, 22]
[1, -123, 89, 94, -70, -97, -54, -58, -82, -10, -92, 10, -85, 115, -61, 85, 33, -109, 66, 71, -76, 86, -19, -37, 28, 66, 56, 72, -101, -56, -58, 22]

Import as Dependency:

JVM

dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
}

Add to libs/ folder

Badges
Extracted from project README
CodeQL master Maven Central GitHub license