Some more sketching of the public API, added workaround for uint backing class kotln bug, worked around new js bug
This commit is contained in:
parent
fc2d7b701d
commit
1a4fc90922
@ -2,8 +2,10 @@ package com.ionspin.kotlin.crypto
|
||||
|
||||
import com.ionspin.kotlin.crypto.hash.blake2b.Blake2bProperties
|
||||
import com.ionspin.kotlin.crypto.hash.blake2b.Blake2bPure
|
||||
import com.ionspin.kotlin.crypto.hash.encodeToUByteArray
|
||||
import com.ionspin.kotlin.crypto.hash.sha.Sha256Pure
|
||||
import com.ionspin.kotlin.crypto.hash.sha.Sha512Pure
|
||||
import com.ionspin.kotlin.crypto.util.toHexString
|
||||
|
||||
/**
|
||||
* Created by Ugljesa Jovanovic
|
||||
@ -65,3 +67,47 @@ object Crypto : CryptoProvider {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
inline class EncryptableString(val content: String) : Encryptable {
|
||||
override fun encryptableData(): UByteArray {
|
||||
return content.encodeToUByteArray()
|
||||
}
|
||||
|
||||
fun asString() : String = content
|
||||
|
||||
}
|
||||
|
||||
fun String.asEncryptableString() : EncryptableString {
|
||||
return EncryptableString(this)
|
||||
}
|
||||
|
||||
interface Encryptable {
|
||||
fun encryptableData() : UByteArray
|
||||
}
|
||||
|
||||
object PublicApi {
|
||||
data class HashedData(val hash: UByteArray) {
|
||||
fun toHexString() : String {
|
||||
return hash.toHexString()
|
||||
}
|
||||
}
|
||||
|
||||
data class EncryptedData(val encrypted: UByteArray)
|
||||
|
||||
|
||||
|
||||
object Hash {
|
||||
fun hash() : HashedData {
|
||||
TODO()
|
||||
}
|
||||
}
|
||||
object Symmetric {
|
||||
fun encrypt(data : Encryptable) : EncryptedData {
|
||||
TODO()
|
||||
}
|
||||
|
||||
fun <T: Encryptable> decrypt(encryptedData : EncryptedData) : T {
|
||||
TODO()
|
||||
}
|
||||
}
|
||||
}
|
@ -23,7 +23,9 @@ class XChaCha20Poly1305Pure {
|
||||
ChaCha20Pure.encrypt(
|
||||
oneTimeKey.toLittleEndianUByteArray(),
|
||||
ubyteArrayOf(0U, 0U, 0U, 0U) + nonce.sliceArray(16 until 24),
|
||||
UByteArray(64) { 0U })
|
||||
UByteArray(64) { 0U },
|
||||
0U
|
||||
)
|
||||
println("Poly sub-key:")
|
||||
oneTimeKey.hexColumsPrint()
|
||||
println("Poly key:")
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.ionspin.kotlin.crypto.symmetric
|
||||
|
||||
import com.ionspin.kotlin.crypto.symmetric.LatinDancesCommon.littleEndianInverted
|
||||
import com.ionspin.kotlin.crypto.util.*
|
||||
|
||||
/**
|
||||
@ -59,8 +60,6 @@ internal class ChaCha20Pure {
|
||||
fun encrypt(key: UByteArray, nonce: UByteArray, message: UByteArray, initialCounter: UInt = 0U): UByteArray {
|
||||
val ciphertext = UByteArray(message.size)
|
||||
val state = UIntArray(16) {
|
||||
|
||||
|
||||
when (it) {
|
||||
0 -> sigma0_32
|
||||
1 -> sigma1_32
|
||||
|
@ -1,45 +0,0 @@
|
||||
package com.ionspin.kotlin.crypto.symmetric
|
||||
|
||||
/**
|
||||
* Created by Ugljesa Jovanovic
|
||||
* ugljesa.jovanovic@ionspin.com
|
||||
* on 16-Jun-2020
|
||||
*/
|
||||
fun littleEndian(
|
||||
input: UByteArray,
|
||||
byte0Position: Int,
|
||||
byte1Position: Int,
|
||||
byte2Position: Int,
|
||||
byte3Position: Int
|
||||
): UInt {
|
||||
var uint = 0U
|
||||
uint = input[byte0Position].toUInt()
|
||||
uint = uint or (input[byte1Position].toUInt() shl 8)
|
||||
uint = uint or (input[byte2Position].toUInt() shl 16)
|
||||
uint = uint or (input[byte3Position].toUInt() shl 24)
|
||||
|
||||
return uint
|
||||
}
|
||||
|
||||
fun littleEndianInverted(
|
||||
input: UIntArray,
|
||||
startingPosition: Int,
|
||||
output: UByteArray,
|
||||
outputPosition: Int
|
||||
) {
|
||||
output[outputPosition] = (input[startingPosition] and 0xFFU).toUByte()
|
||||
output[outputPosition + 1] = ((input[startingPosition] shr 8) and 0xFFU).toUByte()
|
||||
output[outputPosition + 2] = ((input[startingPosition] shr 16) and 0xFFU).toUByte()
|
||||
output[outputPosition + 3] = ((input[startingPosition] shr 24) and 0xFFU).toUByte()
|
||||
}
|
||||
|
||||
fun littleEndianInverted(
|
||||
input: UInt,
|
||||
output: UByteArray,
|
||||
outputPosition: Int
|
||||
) {
|
||||
output[outputPosition] = (input and 0xFFU).toUByte()
|
||||
output[outputPosition + 1] = ((input shr 8) and 0xFFU).toUByte()
|
||||
output[outputPosition + 2] = ((input shr 16) and 0xFFU).toUByte()
|
||||
output[outputPosition + 3] = ((input shr 24) and 0xFFU).toUByte()
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package com.ionspin.kotlin.crypto.symmetric
|
||||
|
||||
/**
|
||||
* Created by Ugljesa Jovanovic
|
||||
* ugljesa.jovanovic@ionspin.com
|
||||
* on 16-Jun-2020
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
object LatinDancesCommon {
|
||||
|
||||
val _emitIntArray: IntArray = intArrayOf(1)
|
||||
|
||||
fun littleEndian(
|
||||
input: UByteArray,
|
||||
byte0Position: Int,
|
||||
byte1Position: Int,
|
||||
byte2Position: Int,
|
||||
byte3Position: Int
|
||||
): UInt {
|
||||
var uint = 0U
|
||||
uint = input[byte0Position].toUInt()
|
||||
uint = uint or (input[byte1Position].toUInt() shl 8)
|
||||
uint = uint or (input[byte2Position].toUInt() shl 16)
|
||||
uint = uint or (input[byte3Position].toUInt() shl 24)
|
||||
|
||||
return uint
|
||||
}
|
||||
|
||||
fun littleEndianInverted(
|
||||
input: UIntArray,
|
||||
startingPosition: Int,
|
||||
output: UByteArray,
|
||||
outputPosition: Int
|
||||
) {
|
||||
output[outputPosition] = (input[startingPosition] and 0xFFU).toUByte()
|
||||
output[outputPosition + 1] = ((input[startingPosition] shr 8) and 0xFFU).toUByte()
|
||||
output[outputPosition + 2] = ((input[startingPosition] shr 16) and 0xFFU).toUByte()
|
||||
output[outputPosition + 3] = ((input[startingPosition] shr 24) and 0xFFU).toUByte()
|
||||
}
|
||||
|
||||
fun littleEndianInverted(
|
||||
input: UInt,
|
||||
output: UByteArray,
|
||||
outputPosition: Int
|
||||
) {
|
||||
output[outputPosition] = (input and 0xFFU).toUByte()
|
||||
output[outputPosition + 1] = ((input shr 8) and 0xFFU).toUByte()
|
||||
output[outputPosition + 2] = ((input shr 16) and 0xFFU).toUByte()
|
||||
output[outputPosition + 3] = ((input shr 24) and 0xFFU).toUByte()
|
||||
}
|
||||
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
package com.ionspin.kotlin.crypto.symmetric
|
||||
|
||||
import com.ionspin.kotlin.crypto.symmetric.LatinDancesCommon.littleEndianInverted
|
||||
import com.ionspin.kotlin.crypto.util.*
|
||||
|
||||
/**
|
||||
@ -49,10 +50,10 @@ internal class Salsa20Pure {
|
||||
return result
|
||||
}
|
||||
|
||||
internal val sigma0_32_uint = 1634760805U //ubyteArrayOf(101U, 120U, 112U, 97U)
|
||||
internal val sigma1_32_uint = 857760878U //ubyteArrayOf(110U, 100U, 32U, 51U)
|
||||
internal val sigma2_32_uint = 2036477234U //ubyteArrayOf(50U, 45U, 98U, 121U)
|
||||
internal val sigma3_32_uint = 1797285236U //ubyteArrayOf(116U, 101U, 32U, 107U)
|
||||
internal var sigma0_32_uint = 1634760805U //ubyteArrayOf(101U, 120U, 112U, 97U)
|
||||
internal var sigma1_32_uint = 857760878U //ubyteArrayOf(110U, 100U, 32U, 51U)
|
||||
internal var sigma2_32_uint = 2036477234U //ubyteArrayOf(50U, 45U, 98U, 121U)
|
||||
internal var sigma3_32_uint = 1797285236U //ubyteArrayOf(116U, 101U, 32U, 107U)
|
||||
|
||||
val sigma0_32 = ubyteArrayOf(101U, 120U, 112U, 97U)
|
||||
val sigma1_32 = ubyteArrayOf(110U, 100U, 32U, 51U)
|
||||
|
@ -18,9 +18,9 @@
|
||||
|
||||
package com.ionspin.kotlin.crypto.util
|
||||
|
||||
import com.ionspin.kotlin.crypto.keyderivation.argon2.Argon2Utils
|
||||
import com.ionspin.kotlin.crypto.keyderivation.argon2.xorWithBlock
|
||||
|
||||
|
||||
val _emitIntArray: IntArray = intArrayOf(1)
|
||||
/**
|
||||
* Created by Ugljesa Jovanovic
|
||||
* ugljesa.jovanovic@ionspin.com
|
||||
|
@ -1,56 +1,56 @@
|
||||
package com.ionspin.kotlin.crypto.authenticated
|
||||
|
||||
import com.ionspin.kotlin.crypto.hash.encodeToUByteArray
|
||||
import com.ionspin.kotlin.crypto.util.hexColumsPrint
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
/**
|
||||
* Created by Ugljesa Jovanovic
|
||||
* ugljesa.jovanovic@ionspin.com
|
||||
* on 17-Jun-2020
|
||||
*/
|
||||
class ChaCha20Poly1305Test {
|
||||
|
||||
|
||||
|
||||
@Test
|
||||
fun chaCha20Poly1305() {
|
||||
val message = ("Ladies and Gentlemen of the class of '99: If I could offer you " +
|
||||
"only one tip for the future, sunscreen would be it.").encodeToUByteArray()
|
||||
|
||||
val additionalData = ubyteArrayOf(
|
||||
0x50U, 0x51U, 0x52U, 0x53U, 0xc0U, 0xc1U, 0xc2U, 0xc3U, 0xc4U, 0xc5U, 0xc6U, 0xc7U
|
||||
)
|
||||
val key = ubyteArrayOf(
|
||||
0x80U, 0x81U, 0x82U, 0x83U, 0x84U, 0x85U, 0x86U, 0x87U,
|
||||
0x88U, 0x89U, 0x8aU, 0x8bU, 0x8cU, 0x8dU, 0x8eU, 0x8fU,
|
||||
0x90U, 0x91U, 0x92U, 0x93U, 0x94U, 0x95U, 0x96U, 0x97U,
|
||||
0x98U, 0x99U, 0x9aU, 0x9bU, 0x9cU, 0x9dU, 0x9eU, 0x9fU,
|
||||
)
|
||||
|
||||
val nonce = ubyteArrayOf(
|
||||
0x07U, 0x00U, 0x00U, 0x00U, 0x40U, 0x41U, 0x42U, 0x43U, 0x44U, 0x45U, 0x46U, 0x47U
|
||||
)
|
||||
//Ciphertext + Poly1305TAG
|
||||
val expected = ubyteArrayOf(
|
||||
0xd3U, 0x1aU, 0x8dU, 0x34U, 0x64U, 0x8eU, 0x60U, 0xdbU, 0x7bU, 0x86U, 0xafU, 0xbcU, 0x53U, 0xefU, 0x7eU, 0xc2U,
|
||||
0xa4U, 0xadU, 0xedU, 0x51U, 0x29U, 0x6eU, 0x08U, 0xfeU, 0xa9U, 0xe2U, 0xb5U, 0xa7U, 0x36U, 0xeeU, 0x62U, 0xd6U,
|
||||
0x3dU, 0xbeU, 0xa4U, 0x5eU, 0x8cU, 0xa9U, 0x67U, 0x12U, 0x82U, 0xfaU, 0xfbU, 0x69U, 0xdaU, 0x92U, 0x72U, 0x8bU,
|
||||
0x1aU, 0x71U, 0xdeU, 0x0aU, 0x9eU, 0x06U, 0x0bU, 0x29U, 0x05U, 0xd6U, 0xa5U, 0xb6U, 0x7eU, 0xcdU, 0x3bU, 0x36U,
|
||||
0x92U, 0xddU, 0xbdU, 0x7fU, 0x2dU, 0x77U, 0x8bU, 0x8cU, 0x98U, 0x03U, 0xaeU, 0xe3U, 0x28U, 0x09U, 0x1bU, 0x58U,
|
||||
0xfaU, 0xb3U, 0x24U, 0xe4U, 0xfaU, 0xd6U, 0x75U, 0x94U, 0x55U, 0x85U, 0x80U, 0x8bU, 0x48U, 0x31U, 0xd7U, 0xbcU,
|
||||
0x3fU, 0xf4U, 0xdeU, 0xf0U, 0x8eU, 0x4bU, 0x7aU, 0x9dU, 0xe5U, 0x76U, 0xd2U, 0x65U, 0x86U, 0xceU, 0xc6U, 0x4bU,
|
||||
0x61U, 0x16U, 0x1aU, 0xe1U, 0x0bU, 0x59U, 0x4fU, 0x09U, 0xe2U, 0x6aU, 0x7eU, 0x90U, 0x2eU, 0xcbU, 0xd0U, 0x60U,
|
||||
0x06U, 0x91U
|
||||
)
|
||||
val result = ChaCha20Poly1305Pure.encrypt(key, nonce, message, additionalData)
|
||||
result.hexColumsPrint()
|
||||
assertTrue {
|
||||
result.contentEquals(expected)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
//package com.ionspin.kotlin.crypto.authenticated
|
||||
//
|
||||
//import com.ionspin.kotlin.crypto.hash.encodeToUByteArray
|
||||
//import com.ionspin.kotlin.crypto.util.hexColumsPrint
|
||||
//import kotlin.test.Test
|
||||
//import kotlin.test.assertTrue
|
||||
//
|
||||
///**
|
||||
// * Created by Ugljesa Jovanovic
|
||||
// * ugljesa.jovanovic@ionspin.com
|
||||
// * on 17-Jun-2020
|
||||
// */
|
||||
//class ChaCha20Poly1305Test {
|
||||
//
|
||||
//
|
||||
//
|
||||
// @Test
|
||||
// fun chaCha20Poly1305() {
|
||||
// val message = ("Ladies and Gentlemen of the class of '99: If I could offer you " +
|
||||
// "only one tip for the future, sunscreen would be it.").encodeToUByteArray()
|
||||
//
|
||||
// val additionalData = ubyteArrayOf(
|
||||
// 0x50U, 0x51U, 0x52U, 0x53U, 0xc0U, 0xc1U, 0xc2U, 0xc3U, 0xc4U, 0xc5U, 0xc6U, 0xc7U
|
||||
// )
|
||||
// val key = ubyteArrayOf(
|
||||
// 0x80U, 0x81U, 0x82U, 0x83U, 0x84U, 0x85U, 0x86U, 0x87U,
|
||||
// 0x88U, 0x89U, 0x8aU, 0x8bU, 0x8cU, 0x8dU, 0x8eU, 0x8fU,
|
||||
// 0x90U, 0x91U, 0x92U, 0x93U, 0x94U, 0x95U, 0x96U, 0x97U,
|
||||
// 0x98U, 0x99U, 0x9aU, 0x9bU, 0x9cU, 0x9dU, 0x9eU, 0x9fU,
|
||||
// )
|
||||
//
|
||||
// val nonce = ubyteArrayOf(
|
||||
// 0x07U, 0x00U, 0x00U, 0x00U, 0x40U, 0x41U, 0x42U, 0x43U, 0x44U, 0x45U, 0x46U, 0x47U
|
||||
// )
|
||||
// //Ciphertext + Poly1305TAG
|
||||
// val expected = ubyteArrayOf(
|
||||
// 0xd3U, 0x1aU, 0x8dU, 0x34U, 0x64U, 0x8eU, 0x60U, 0xdbU, 0x7bU, 0x86U, 0xafU, 0xbcU, 0x53U, 0xefU, 0x7eU, 0xc2U,
|
||||
// 0xa4U, 0xadU, 0xedU, 0x51U, 0x29U, 0x6eU, 0x08U, 0xfeU, 0xa9U, 0xe2U, 0xb5U, 0xa7U, 0x36U, 0xeeU, 0x62U, 0xd6U,
|
||||
// 0x3dU, 0xbeU, 0xa4U, 0x5eU, 0x8cU, 0xa9U, 0x67U, 0x12U, 0x82U, 0xfaU, 0xfbU, 0x69U, 0xdaU, 0x92U, 0x72U, 0x8bU,
|
||||
// 0x1aU, 0x71U, 0xdeU, 0x0aU, 0x9eU, 0x06U, 0x0bU, 0x29U, 0x05U, 0xd6U, 0xa5U, 0xb6U, 0x7eU, 0xcdU, 0x3bU, 0x36U,
|
||||
// 0x92U, 0xddU, 0xbdU, 0x7fU, 0x2dU, 0x77U, 0x8bU, 0x8cU, 0x98U, 0x03U, 0xaeU, 0xe3U, 0x28U, 0x09U, 0x1bU, 0x58U,
|
||||
// 0xfaU, 0xb3U, 0x24U, 0xe4U, 0xfaU, 0xd6U, 0x75U, 0x94U, 0x55U, 0x85U, 0x80U, 0x8bU, 0x48U, 0x31U, 0xd7U, 0xbcU,
|
||||
// 0x3fU, 0xf4U, 0xdeU, 0xf0U, 0x8eU, 0x4bU, 0x7aU, 0x9dU, 0xe5U, 0x76U, 0xd2U, 0x65U, 0x86U, 0xceU, 0xc6U, 0x4bU,
|
||||
// 0x61U, 0x16U, 0x1aU, 0xe1U, 0x0bU, 0x59U, 0x4fU, 0x09U, 0xe2U, 0x6aU, 0x7eU, 0x90U, 0x2eU, 0xcbU, 0xd0U, 0x60U,
|
||||
// 0x06U, 0x91U
|
||||
// )
|
||||
// val result = ChaCha20Poly1305Pure.encrypt(key, nonce, message, additionalData)
|
||||
// result.hexColumsPrint()
|
||||
// assertTrue {
|
||||
// result.contentEquals(expected)
|
||||
// }
|
||||
//
|
||||
// }
|
||||
//
|
||||
//
|
||||
//}
|
@ -79,8 +79,6 @@ class XChaCha20Poly1305Test {
|
||||
val expected = ubyteArrayOf(
|
||||
0xbdU, 0x3bU, 0x8aU, 0xd7U, 0xa1U, 0x9dU, 0xe8U, 0xc4U, 0x55U,
|
||||
0x84U, 0x6fU, 0xfcU, 0x75U, 0x31U, 0xbfU, 0x0cU, 0x2dU
|
||||
// 0x17U, 0x4bU, 0x0aU, 0xb4U, 0x63U, 0x42U, 0xcbU, 0x76U,
|
||||
// 0xf9U, 0xf8U, 0x9bU, 0x40U, 0xbfU, 0xdcU, 0x46U, 0x67U,
|
||||
)
|
||||
val result = XChaCha20Poly1305Pure.encrypt(key, nonce, message, additionalData)
|
||||
result.contentEquals(expected)
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.ionspin.kotlin.crypto.symmetric
|
||||
|
||||
import com.ionspin.kotlin.crypto.symmetric.LatinDancesCommon.littleEndian
|
||||
import com.ionspin.kotlin.crypto.symmetric.LatinDancesCommon.littleEndianInverted
|
||||
import com.ionspin.kotlin.crypto.util.fromLittleEndianToUInt
|
||||
import com.ionspin.kotlin.crypto.util.hexStringToUByteArray
|
||||
import com.ionspin.kotlin.crypto.util.rotateLeft
|
||||
|
Loading…
x
Reference in New Issue
Block a user