diff --git a/library/keccak/api/keccak.api b/library/keccak/api/keccak.api index f0b4b8f..a239dbf 100644 --- a/library/keccak/api/keccak.api +++ b/library/keccak/api/keccak.api @@ -2,8 +2,13 @@ public final class org/kotlincrypto/sponges/keccak/F1600 : org/kotlincrypto/spon public fun <init> ()V public fun addData (IJ)V public synthetic fun addData (ILjava/lang/Number;)V + public fun contains (J)Z + public fun containsAll (Ljava/util/Collection;)Z public fun copy ()Lorg/kotlincrypto/sponges/keccak/F1600; public synthetic fun copy ()Lorg/kotlincrypto/sponges/keccak/State; + public fun get (I)Ljava/lang/Long; + public synthetic fun get (I)Ljava/lang/Number; + public fun iterator ()Ljava/util/Iterator; public fun reset ()V } @@ -11,8 +16,13 @@ public final class org/kotlincrypto/sponges/keccak/F200 : org/kotlincrypto/spong public fun <init> ()V public fun addData (IB)V public synthetic fun addData (ILjava/lang/Number;)V + public fun contains (B)Z + public fun containsAll (Ljava/util/Collection;)Z public fun copy ()Lorg/kotlincrypto/sponges/keccak/F200; public synthetic fun copy ()Lorg/kotlincrypto/sponges/keccak/State; + public fun get (I)Ljava/lang/Byte; + public synthetic fun get (I)Ljava/lang/Number; + public fun iterator ()Ljava/util/Iterator; public fun reset ()V } @@ -20,8 +30,13 @@ public final class org/kotlincrypto/sponges/keccak/F400 : org/kotlincrypto/spong public fun <init> ()V public synthetic fun addData (ILjava/lang/Number;)V public fun addData (IS)V + public fun contains (S)Z + public fun containsAll (Ljava/util/Collection;)Z public fun copy ()Lorg/kotlincrypto/sponges/keccak/F400; public synthetic fun copy ()Lorg/kotlincrypto/sponges/keccak/State; + public synthetic fun get (I)Ljava/lang/Number; + public fun get (I)Ljava/lang/Short; + public fun iterator ()Ljava/util/Iterator; public fun reset ()V } @@ -29,8 +44,13 @@ public final class org/kotlincrypto/sponges/keccak/F800 : org/kotlincrypto/spong public fun <init> ()V public fun addData (II)V public synthetic fun addData (ILjava/lang/Number;)V + public fun contains (I)Z + public fun containsAll (Ljava/util/Collection;)Z public fun copy ()Lorg/kotlincrypto/sponges/keccak/F800; public synthetic fun copy ()Lorg/kotlincrypto/sponges/keccak/State; + public fun get (I)Ljava/lang/Integer; + public synthetic fun get (I)Ljava/lang/Number; + public fun iterator ()Ljava/util/Iterator; public fun reset ()V } @@ -54,22 +74,20 @@ public final class org/kotlincrypto/sponges/keccak/KeccakPKt { public abstract class org/kotlincrypto/sponges/keccak/State : java/util/Collection, kotlin/jvm/internal/markers/KMappedMarker { protected static final field Companion Lorg/kotlincrypto/sponges/keccak/State$Companion; - protected final field array [Ljava/lang/Number; public final field roundCount B - public synthetic fun <init> (B[Ljava/lang/Number;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun <init> (BLkotlin/jvm/internal/DefaultConstructorMarker;)V public fun add (Ljava/lang/Number;)Z public synthetic fun add (Ljava/lang/Object;)Z public fun addAll (Ljava/util/Collection;)Z public abstract fun addData (ILjava/lang/Number;)V public fun clear ()V - public final fun contains (Ljava/lang/Number;)Z + public abstract fun contains (Ljava/lang/Number;)Z public final fun contains (Ljava/lang/Object;)Z - public final fun containsAll (Ljava/util/Collection;)Z public abstract fun copy ()Lorg/kotlincrypto/sponges/keccak/State; - public final fun get (I)Ljava/lang/Number; + public abstract fun get (I)Ljava/lang/Number; public final fun getSize ()I public final fun isEmpty ()Z - public final fun iterator ()Ljava/util/Iterator; + public fun iterator ()Ljava/util/Iterator; public fun remove (Ljava/lang/Object;)Z public fun removeAll (Ljava/util/Collection;)Z public fun removeIf (Ljava/util/function/Predicate;)Z diff --git a/library/keccak/api/keccak.klib.api b/library/keccak/api/keccak.klib.api index 49f6142..74e43c4 100644 --- a/library/keccak/api/keccak.klib.api +++ b/library/keccak/api/keccak.klib.api @@ -10,7 +10,11 @@ final class org.kotlincrypto.sponges.keccak/F1600 : org.kotlincrypto.sponges.kec constructor <init>() // org.kotlincrypto.sponges.keccak/F1600.<init>|<init>(){}[0] final fun addData(kotlin/Int, kotlin/Long) // org.kotlincrypto.sponges.keccak/F1600.addData|addData(kotlin.Int;kotlin.Long){}[0] + final fun contains(kotlin/Long): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F1600.contains|contains(kotlin.Long){}[0] + final fun containsAll(kotlin.collections/Collection<kotlin/Long>): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F1600.containsAll|containsAll(kotlin.collections.Collection<kotlin.Long>){}[0] final fun copy(): org.kotlincrypto.sponges.keccak/F1600 // org.kotlincrypto.sponges.keccak/F1600.copy|copy(){}[0] + final fun get(kotlin/Int): kotlin/Long // org.kotlincrypto.sponges.keccak/F1600.get|get(kotlin.Int){}[0] + final fun iterator(): kotlin.collections/Iterator<kotlin/Long> // org.kotlincrypto.sponges.keccak/F1600.iterator|iterator(){}[0] final fun reset() // org.kotlincrypto.sponges.keccak/F1600.reset|reset(){}[0] } @@ -18,7 +22,11 @@ final class org.kotlincrypto.sponges.keccak/F200 : org.kotlincrypto.sponges.kecc constructor <init>() // org.kotlincrypto.sponges.keccak/F200.<init>|<init>(){}[0] final fun addData(kotlin/Int, kotlin/Byte) // org.kotlincrypto.sponges.keccak/F200.addData|addData(kotlin.Int;kotlin.Byte){}[0] + final fun contains(kotlin/Byte): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F200.contains|contains(kotlin.Byte){}[0] + final fun containsAll(kotlin.collections/Collection<kotlin/Byte>): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F200.containsAll|containsAll(kotlin.collections.Collection<kotlin.Byte>){}[0] final fun copy(): org.kotlincrypto.sponges.keccak/F200 // org.kotlincrypto.sponges.keccak/F200.copy|copy(){}[0] + final fun get(kotlin/Int): kotlin/Byte // org.kotlincrypto.sponges.keccak/F200.get|get(kotlin.Int){}[0] + final fun iterator(): kotlin.collections/Iterator<kotlin/Byte> // org.kotlincrypto.sponges.keccak/F200.iterator|iterator(){}[0] final fun reset() // org.kotlincrypto.sponges.keccak/F200.reset|reset(){}[0] } @@ -26,7 +34,11 @@ final class org.kotlincrypto.sponges.keccak/F400 : org.kotlincrypto.sponges.kecc constructor <init>() // org.kotlincrypto.sponges.keccak/F400.<init>|<init>(){}[0] final fun addData(kotlin/Int, kotlin/Short) // org.kotlincrypto.sponges.keccak/F400.addData|addData(kotlin.Int;kotlin.Short){}[0] + final fun contains(kotlin/Short): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F400.contains|contains(kotlin.Short){}[0] + final fun containsAll(kotlin.collections/Collection<kotlin/Short>): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F400.containsAll|containsAll(kotlin.collections.Collection<kotlin.Short>){}[0] final fun copy(): org.kotlincrypto.sponges.keccak/F400 // org.kotlincrypto.sponges.keccak/F400.copy|copy(){}[0] + final fun get(kotlin/Int): kotlin/Short // org.kotlincrypto.sponges.keccak/F400.get|get(kotlin.Int){}[0] + final fun iterator(): kotlin.collections/Iterator<kotlin/Short> // org.kotlincrypto.sponges.keccak/F400.iterator|iterator(){}[0] final fun reset() // org.kotlincrypto.sponges.keccak/F400.reset|reset(){}[0] } @@ -34,15 +46,17 @@ final class org.kotlincrypto.sponges.keccak/F800 : org.kotlincrypto.sponges.kecc constructor <init>() // org.kotlincrypto.sponges.keccak/F800.<init>|<init>(){}[0] final fun addData(kotlin/Int, kotlin/Int) // org.kotlincrypto.sponges.keccak/F800.addData|addData(kotlin.Int;kotlin.Int){}[0] + final fun contains(kotlin/Int): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F800.contains|contains(kotlin.Int){}[0] + final fun containsAll(kotlin.collections/Collection<kotlin/Int>): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F800.containsAll|containsAll(kotlin.collections.Collection<kotlin.Int>){}[0] final fun copy(): org.kotlincrypto.sponges.keccak/F800 // org.kotlincrypto.sponges.keccak/F800.copy|copy(){}[0] + final fun get(kotlin/Int): kotlin/Int // org.kotlincrypto.sponges.keccak/F800.get|get(kotlin.Int){}[0] + final fun iterator(): kotlin.collections/Iterator<kotlin/Int> // org.kotlincrypto.sponges.keccak/F800.iterator|iterator(){}[0] final fun reset() // org.kotlincrypto.sponges.keccak/F800.reset|reset(){}[0] } sealed class <#A: kotlin/Number, #B: org.kotlincrypto.sponges.keccak/State<#A, #B>> org.kotlincrypto.sponges.keccak/State : kotlin.collections/Collection<#A> { // org.kotlincrypto.sponges.keccak/State|null[0] - constructor <init>(kotlin/Byte, kotlin/Array<#A>) // org.kotlincrypto.sponges.keccak/State.<init>|<init>(kotlin.Byte;kotlin.Array<1:0>){}[0] + constructor <init>(kotlin/Byte) // org.kotlincrypto.sponges.keccak/State.<init>|<init>(kotlin.Byte){}[0] - final val array // org.kotlincrypto.sponges.keccak/State.array|{}array[0] - final fun <get-array>(): kotlin/Array<#A> // org.kotlincrypto.sponges.keccak/State.array.<get-array>|<get-array>(){}[0] final val roundCount // org.kotlincrypto.sponges.keccak/State.roundCount|{}roundCount[0] final fun <get-roundCount>(): kotlin/Byte // org.kotlincrypto.sponges.keccak/State.roundCount.<get-roundCount>|<get-roundCount>(){}[0] final val size // org.kotlincrypto.sponges.keccak/State.size|{}size[0] @@ -50,12 +64,9 @@ sealed class <#A: kotlin/Number, #B: org.kotlincrypto.sponges.keccak/State<#A, # abstract fun addData(kotlin/Int, #A) // org.kotlincrypto.sponges.keccak/State.addData|addData(kotlin.Int;1:0){}[0] abstract fun copy(): #B // org.kotlincrypto.sponges.keccak/State.copy|copy(){}[0] + abstract fun get(kotlin/Int): #A // org.kotlincrypto.sponges.keccak/State.get|get(kotlin.Int){}[0] abstract fun reset() // org.kotlincrypto.sponges.keccak/State.reset|reset(){}[0] - final fun contains(#A): kotlin/Boolean // org.kotlincrypto.sponges.keccak/State.contains|contains(1:0){}[0] - final fun containsAll(kotlin.collections/Collection<#A>): kotlin/Boolean // org.kotlincrypto.sponges.keccak/State.containsAll|containsAll(kotlin.collections.Collection<1:0>){}[0] - final fun get(kotlin/Int): #A // org.kotlincrypto.sponges.keccak/State.get|get(kotlin.Int){}[0] final fun isEmpty(): kotlin/Boolean // org.kotlincrypto.sponges.keccak/State.isEmpty|isEmpty(){}[0] - final fun iterator(): kotlin.collections/Iterator<#A> // org.kotlincrypto.sponges.keccak/State.iterator|iterator(){}[0] final object Companion // org.kotlincrypto.sponges.keccak/State.Companion|null[0] } diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F1600.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F1600.kt index 57c75b9..dbe8329 100644 --- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F1600.kt +++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F1600.kt @@ -15,16 +15,39 @@ **/ package org.kotlincrypto.sponges.keccak +import kotlin.jvm.JvmSynthetic + /** * [State] for Keccak-f[1600] * * @see [keccakP] * */ public class F1600: State<Long, F1600> { - public constructor(): super(roundCount = 24, array = Array(P_LEN) { 0 }) - private constructor(state: F1600): super(state.roundCount, state.array.copyOf()) - public override fun copy(): F1600 = F1600(this) + + @get:JvmSynthetic + internal val array: LongArray + + public constructor(): super(roundCount = 24) { + array = LongArray(P_LEN) { 0 } + } + private constructor(state: F1600): super(state.roundCount) { + array = state.array.copyOf() + } + + @Throws(IndexOutOfBoundsException::class) + public override operator fun get(index: Int): Long = array[index] + @Throws(IndexOutOfBoundsException::class) public override fun addData(index: Int, data: Long) { array[index] = array[index] xor data } + public override fun copy(): F1600 = F1600(this) public override fun reset() { array.fill(0) } + + public override fun iterator(): Iterator<Long> = array.iterator() + public override fun contains(element: Long): Boolean = array.contains(element) + public override fun containsAll(elements: Collection<Long>): Boolean { + elements.forEach { n -> + if (!array.contains(n)) return false + } + return true + } } diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F200.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F200.kt index 9eeafe8..db2411f 100644 --- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F200.kt +++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F200.kt @@ -16,6 +16,7 @@ package org.kotlincrypto.sponges.keccak import kotlin.experimental.xor +import kotlin.jvm.JvmSynthetic /** * [State] for Keccak-f[200] @@ -23,10 +24,31 @@ import kotlin.experimental.xor * @see [keccakP] * */ public class F200: State<Byte, F200> { - public constructor(): super(roundCount = 18, array = Array(P_LEN) { 0 }) - private constructor(state: F200): super(state.roundCount, state.array.copyOf()) - public override fun copy(): F200 = F200(this) + + @get:JvmSynthetic + internal val array: ByteArray + + public constructor(): super(roundCount = 18) { + array = ByteArray(P_LEN) { 0 } + } + private constructor(state: F200): super(state.roundCount) { + array = state.array.copyOf() + } + + @Throws(IndexOutOfBoundsException::class) + public override operator fun get(index: Int): Byte = array[index] + @Throws(IndexOutOfBoundsException::class) public override fun addData(index: Int, data: Byte) { array[index] = array[index] xor data } + public override fun copy(): F200 = F200(this) public override fun reset() { array.fill(0) } + + public override fun iterator(): Iterator<Byte> = array.iterator() + public override fun contains(element: Byte): Boolean = array.contains(element) + public override fun containsAll(elements: Collection<Byte>): Boolean { + elements.forEach { n -> + if (!array.contains(n)) return false + } + return true + } } diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F400.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F400.kt index 3803ccb..d80dc45 100644 --- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F400.kt +++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F400.kt @@ -16,6 +16,7 @@ package org.kotlincrypto.sponges.keccak import kotlin.experimental.xor +import kotlin.jvm.JvmSynthetic /** * [State] for Keccak-f[400] @@ -23,10 +24,31 @@ import kotlin.experimental.xor * @see [keccakP] * */ public class F400: State<Short, F400> { - public constructor(): super(roundCount = 20, array = Array(P_LEN) { 0 }) - private constructor(state: F400): super(state.roundCount, state.array.copyOf()) - public override fun copy(): F400 = F400(this) + + @get:JvmSynthetic + internal val array: ShortArray + + public constructor(): super(roundCount = 20) { + array = ShortArray(P_LEN) { 0 } + } + private constructor(state: F400): super(state.roundCount) { + array = state.array.copyOf() + } + + @Throws(IndexOutOfBoundsException::class) + public override operator fun get(index: Int): Short = array[index] + @Throws(IndexOutOfBoundsException::class) public override fun addData(index: Int, data: Short) { array[index] = array[index] xor data } + public override fun copy(): F400 = F400(this) public override fun reset() { array.fill(0) } + + public override fun iterator(): Iterator<Short> = array.iterator() + public override fun contains(element: Short): Boolean = array.contains(element) + public override fun containsAll(elements: Collection<Short>): Boolean { + elements.forEach { n -> + if (!array.contains(n)) return false + } + return true + } } diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F800.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F800.kt index 5f610d6..0fe3d75 100644 --- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F800.kt +++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F800.kt @@ -15,6 +15,8 @@ **/ package org.kotlincrypto.sponges.keccak +import kotlin.jvm.JvmSynthetic + /** * [State] for Keccak-f[800] @@ -22,10 +24,31 @@ package org.kotlincrypto.sponges.keccak * @see [keccakP] * */ public class F800: State<Int, F800> { - public constructor(): super(roundCount = 22, array = Array(P_LEN) { 0 }) - private constructor(state: F800): super(state.roundCount, state.array.copyOf()) - public override fun copy(): F800 = F800(this) + + @get:JvmSynthetic + internal val array: IntArray + + public constructor(): super(roundCount = 22) { + array = IntArray(P_LEN) { 0 } + } + private constructor(state: F800): super(state.roundCount) { + array = state.array.copyOf() + } + + @Throws(IndexOutOfBoundsException::class) + public override operator fun get(index: Int): Int = array[index] + @Throws(IndexOutOfBoundsException::class) public override fun addData(index: Int, data: Int) { array[index] = array[index] xor data } + public override fun copy(): F800 = F800(this) public override fun reset() { array.fill(0) } + + public override fun iterator(): Iterator<Int> = array.iterator() + public override fun contains(element: Int): Boolean = array.contains(element) + public override fun containsAll(elements: Collection<Int>): Boolean { + elements.forEach { n -> + if (!array.contains(n)) return false + } + return true + } } diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/KeccakP.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/KeccakP.kt index 8ef1366..2e681c4 100644 --- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/KeccakP.kt +++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/KeccakP.kt @@ -51,7 +51,7 @@ private val RC = longArrayOf( @Throws(IllegalArgumentException::class) public fun F1600.keccakP(rounds: Byte = roundCount) { checkRounds(rounds) ?: return - val A = lanes() + val A = array var a00 = A[ 0]; var a01 = A[ 1]; var a02 = A[ 2]; var a03 = A[ 3]; var a04 = A[ 4] var a05 = A[ 5]; var a06 = A[ 6]; var a07 = A[ 7]; var a08 = A[ 8]; var a09 = A[ 9] @@ -187,7 +187,7 @@ public fun F1600.keccakP(rounds: Byte = roundCount) { @Throws(IllegalArgumentException::class) public fun F800.keccakP(rounds: Byte = roundCount) { checkRounds(rounds) ?: return - val A = lanes() + val A = array var a00 = A[ 0]; var a01 = A[ 1]; var a02 = A[ 2]; var a03 = A[ 3]; var a04 = A[ 4] var a05 = A[ 5]; var a06 = A[ 6]; var a07 = A[ 7]; var a08 = A[ 8]; var a09 = A[ 9] @@ -323,7 +323,7 @@ public fun F800.keccakP(rounds: Byte = roundCount) { @Throws(IllegalArgumentException::class) public fun F400.keccakP(rounds: Byte = roundCount) { checkRounds(rounds) ?: return - val A = lanes() + val A = array var a00 = A[ 0]; var a01 = A[ 1]; var a02 = A[ 2]; var a03 = A[ 3]; var a04 = A[ 4] var a05 = A[ 5]; var a06 = A[ 6]; var a07 = A[ 7]; var a08 = A[ 8]; var a09 = A[ 9] @@ -459,7 +459,7 @@ public fun F400.keccakP(rounds: Byte = roundCount) { @Throws(IllegalArgumentException::class) public fun F200.keccakP(rounds: Byte = roundCount) { checkRounds(rounds) ?: return - val A = lanes() + val A = array var a00 = A[ 0]; var a01 = A[ 1]; var a02 = A[ 2]; var a03 = A[ 3]; var a04 = A[ 4] var a05 = A[ 5]; var a06 = A[ 6]; var a07 = A[ 7]; var a08 = A[ 8]; var a09 = A[ 9] diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/State.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/State.kt index 573c721..ca0a3de 100644 --- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/State.kt +++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/State.kt @@ -18,7 +18,6 @@ package org.kotlincrypto.sponges.keccak import kotlin.jvm.JvmField -import kotlin.jvm.JvmSynthetic /** * Core abstraction for Keccak-p[b, nr] state, or "lanes". @@ -36,18 +35,10 @@ public sealed class State<N: Number, T: State<N, T>>( * */ @JvmField public val roundCount: Byte, - - @JvmField - protected val array: Array<N>, ): Collection<N> { - init { - // state.size will always be 25 - require(array.size == P_LEN) { "state.size must equal $P_LEN" } - } - @Throws(IndexOutOfBoundsException::class) - public operator fun get(index: Int): N = array[index] + public abstract operator fun get(index: Int): N /** * Adds [data] to [data] at the provided [index] @@ -63,27 +54,6 @@ public sealed class State<N: Number, T: State<N, T>>( final override val size: Int get() = P_LEN final override fun isEmpty(): Boolean = false - final override operator fun contains(element: N): Boolean = array.contains(element) - final override fun iterator(): Iterator<N> = object : Iterator<N> { - private val delegate = array.iterator() - - override fun hasNext(): Boolean = delegate.hasNext() - override fun next(): N = delegate.next() - - override fun equals(other: Any?): Boolean = delegate == other - override fun hashCode(): Int = delegate.hashCode() - override fun toString(): String = delegate.toString() - } - final override fun containsAll(elements: Collection<N>): Boolean { - elements.forEach { n -> - if (!array.contains(n)) return false - } - - return true - } - - @JvmSynthetic - internal fun lanes(): Array<N> = array protected companion object { internal const val P_LEN: Int = 25