From 76a2a3edf79383cd4cd3c5ee64d03b5e64e84334 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Thu, 21 May 2020 23:34:22 +0200 Subject: [PATCH] Xor directly from argon matrix without intermediary array --- .../ionspin/kotlin/crypto/keyderivation/argon2/Argon2.kt | 9 ++------- .../kotlin/crypto/keyderivation/argon2/Argon2Utils.kt | 9 +++++++++ .../ionspin/kotlin/crypto/hash/argon/Argon2MatrixTest.kt | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/multiplatform-crypto/src/commonMain/kotlin/com/ionspin/kotlin/crypto/keyderivation/argon2/Argon2.kt b/multiplatform-crypto/src/commonMain/kotlin/com/ionspin/kotlin/crypto/keyderivation/argon2/Argon2.kt index 85d92cb..3fcb9d0 100644 --- a/multiplatform-crypto/src/commonMain/kotlin/com/ionspin/kotlin/crypto/keyderivation/argon2/Argon2.kt +++ b/multiplatform-crypto/src/commonMain/kotlin/com/ionspin/kotlin/crypto/keyderivation/argon2/Argon2.kt @@ -25,10 +25,7 @@ import com.ionspin.kotlin.crypto.keyderivation.KeyDerivationFunction import com.ionspin.kotlin.crypto.keyderivation.argon2.Argon2Utils.argonBlake2bArbitraryLenghtHash import com.ionspin.kotlin.crypto.keyderivation.argon2.Argon2Utils.compressionFunctionG import com.ionspin.kotlin.crypto.keyderivation.argon2.Argon2Utils.validateArgonParameters -import com.ionspin.kotlin.crypto.util.fromLittleEndianArrayToUInt -import com.ionspin.kotlin.crypto.util.hexColumsPrint -import com.ionspin.kotlin.crypto.util.toLittleEndianUByteArray -import com.ionspin.kotlin.crypto.util.xor +import com.ionspin.kotlin.crypto.util.* /** * Created by Ugljesa Jovanovic @@ -330,10 +327,8 @@ class Argon2( //Temporary fold val acc = matrix.getBlockAt(0, columnCount - 1).copyOf() for (i in 1 until parallelism) { - acc.hexColumsPrint(1024) - (acc xor matrix.getBlockAt(i, columnCount -1)).copyInto(acc) + (acc.xorWithBlock(matrix, i, columnCount - 1).copyInto(acc)) } - acc.hexColumsPrint(1024) //Hash the xored last blocks val hash = argonBlake2bArbitraryLenghtHash(acc, tagLength) matrix.clearMatrix() diff --git a/multiplatform-crypto/src/commonMain/kotlin/com/ionspin/kotlin/crypto/keyderivation/argon2/Argon2Utils.kt b/multiplatform-crypto/src/commonMain/kotlin/com/ionspin/kotlin/crypto/keyderivation/argon2/Argon2Utils.kt index e3744d4..ebbad77 100644 --- a/multiplatform-crypto/src/commonMain/kotlin/com/ionspin/kotlin/crypto/keyderivation/argon2/Argon2Utils.kt +++ b/multiplatform-crypto/src/commonMain/kotlin/com/ionspin/kotlin/crypto/keyderivation/argon2/Argon2Utils.kt @@ -19,6 +19,7 @@ package com.ionspin.kotlin.crypto.keyderivation.argon2 import com.ionspin.kotlin.crypto.hash.blake2b.Blake2b +import com.ionspin.kotlin.crypto.keyderivation.argon2.Argon2Utils.BLOCK_SIZE import com.ionspin.kotlin.crypto.util.arrayChunked import com.ionspin.kotlin.crypto.util.fromLittleEndianArrayToULong import com.ionspin.kotlin.crypto.util.plus @@ -32,6 +33,7 @@ import com.ionspin.kotlin.crypto.util.xor * on 16-May-2020 */ object Argon2Utils { + const val BLOCK_SIZE = 1024 const val R1 = 32 const val R2 = 24 @@ -185,4 +187,11 @@ object Argon2Utils { } } +} + +// ------------ Arithmetic and other utils + +@ExperimentalUnsignedTypes +fun UByteArray.xorWithBlock(other : Argon2Matrix, rowPosition: Int, columnPosition: Int) : UByteArray { + return UByteArray(BLOCK_SIZE) { this[it] xor other[rowPosition, columnPosition, it] } } \ No newline at end of file diff --git a/multiplatform-crypto/src/commonTest/kotlin/com/ionspin/kotlin/crypto/hash/argon/Argon2MatrixTest.kt b/multiplatform-crypto/src/commonTest/kotlin/com/ionspin/kotlin/crypto/hash/argon/Argon2MatrixTest.kt index b8af5a4..3cdc432 100644 --- a/multiplatform-crypto/src/commonTest/kotlin/com/ionspin/kotlin/crypto/hash/argon/Argon2MatrixTest.kt +++ b/multiplatform-crypto/src/commonTest/kotlin/com/ionspin/kotlin/crypto/hash/argon/Argon2MatrixTest.kt @@ -72,7 +72,7 @@ class Argon2MatrixTest { zeroesBlock.contentEquals(argon2Matrix.getBlockAt(0, 0)) && onesBlock.contentEquals(argon2Matrix.getBlockAt(0, 1)) && twosBlock.contentEquals(argon2Matrix.getBlockAt(1, 0)) && - threesBlock.contentEquals(argon2Matrix.getBlockAt(1, 1)) + threesBlock.contentEquals(argon2Matrix.getBlockAt(1, 1)) } } } \ No newline at end of file