Short hash implementation and test, updated cbc tests as they ignored padding

This commit is contained in:
Ugljesa Jovanovic 2020-08-28 22:35:33 +02:00 committed by Ugljesa Jovanovic
parent 86611453ea
commit 91cd41c8c1
No known key found for this signature in database
GPG Key ID: 178E6DFCECCB0E0F
12 changed files with 570 additions and 27 deletions

395
js_checklist.txt Normal file
View File

@ -0,0 +1,395 @@
add
base64_variants
ORIGINAL_NO_PADDING
URLSAFE
URLSAFE_NO_PADDING
compare
from_base64
from_hex
from_string
increment
is_zero
libsodium
print
printErr
onRuntimeInitialized
useBackupModule
...
memcmp
memzero
output_formats
pad
unpad
ready
[[
symbols
to_base64
to_hex
to_string
crypto_aead_chacha20poly1305_decrypt
crypto_aead_chacha20poly1305_decrypt_detached
crypto_aead_chacha20poly1305_encrypt
crypto_aead_chacha20poly1305_encrypt_detached
crypto_aead_chacha20poly1305_ietf_decrypt
crypto_aead_chacha20poly1305_ietf_decrypt_detached
crypto_aead_chacha20poly1305_ietf_encrypt
crypto_aead_chacha20poly1305_ietf_encrypt_detached
crypto_aead_chacha20poly1305_ietf_keygen
crypto_aead_chacha20poly1305_keygen
crypto_aead_xchacha20poly1305_ietf_decrypt
crypto_aead_xchacha20poly1305_ietf_decrypt_detached
crypto_aead_xchacha20poly1305_ietf_encrypt
crypto_aead_xchacha20poly1305_ietf_encrypt_detached
crypto_aead_xchacha20poly1305_ietf_keygen
crypto_auth
crypto_auth_hmacsha256
crypto_auth_hmacsha256_keygen
crypto_auth_hmacsha256_verify
crypto_auth_hmacsha512
crypto_auth_hmacsha512_keygen
crypto_auth_hmacsha512_verify
crypto_auth_keygen
crypto_auth_verify
crypto_box_beforenm
crypto_box_curve25519xchacha20poly1305_keypair
crypto_box_curve25519xchacha20poly1305_seal
crypto_box_curve25519xchacha20poly1305_seal_open
crypto_box_detached
crypto_box_easy
crypto_box_easy_afternm
crypto_box_keypair
crypto_box_open_detached
crypto_box_open_easy
crypto_box_open_easy_afternm
crypto_box_seal
crypto_box_seal_open
crypto_box_seed_keypair
crypto_core_ristretto255_add
crypto_core_ristretto255_from_hash
crypto_core_ristretto255_is_valid_point
crypto_core_ristretto255_random
crypto_core_ristretto255_scalar_add
crypto_core_ristretto255_scalar_complement
crypto_core_ristretto255_scalar_invert
crypto_core_ristretto255_scalar_mul
crypto_core_ristretto255_scalar_negate
crypto_core_ristretto255_scalar_random
crypto_core_ristretto255_scalar_reduce
crypto_core_ristretto255_scalar_sub
crypto_core_ristretto255_sub
crypto_generichash DONE
crypto_generichash_blake2b_salt_personal
crypto_generichash_final DONE
crypto_generichash_init DONE
crypto_generichash_keygen
crypto_generichash_update DONE
crypto_hash
crypto_hash_sha256
crypto_hash_sha256_final
crypto_hash_sha256_init
crypto_hash_sha256_update
crypto_hash_sha512
crypto_hash_sha512_final
crypto_hash_sha512_init
crypto_hash_sha512_update
crypto_kdf_derive_from_key
crypto_kdf_keygen
crypto_kx_client_session_keys
crypto_kx_keypair
crypto_kx_seed_keypair
crypto_kx_server_session_keys
crypto_onetimeauth
crypto_onetimeauth_final
crypto_onetimeauth_init
crypto_onetimeauth_keygen
crypto_onetimeauth_update
crypto_onetimeauth_verify
crypto_pwhash
crypto_pwhash_scryptsalsa208sha256
crypto_pwhash_scryptsalsa208sha256_ll
crypto_pwhash_scryptsalsa208sha256_str
crypto_pwhash_scryptsalsa208sha256_str_verify
crypto_pwhash_str
crypto_pwhash_str_needs_rehash
crypto_pwhash_str_verify
crypto_scalarmult
crypto_scalarmult_base
crypto_scalarmult_ristretto255
crypto_scalarmult_ristretto255_base
crypto_secretbox_detached
crypto_secretbox_easy
crypto_secretbox_keygen
crypto_secretbox_open_detached
crypto_secretbox_open_easy
crypto_secretstream_xchacha20poly1305_init_pull DONE
crypto_secretstream_xchacha20poly1305_init_push DONE
crypto_secretstream_xchacha20poly1305_keygen
crypto_secretstream_xchacha20poly1305_pull DONE
crypto_secretstream_xchacha20poly1305_push DONE
crypto_secretstream_xchacha20poly1305_rekey
crypto_shorthash DONE
crypto_shorthash_keygen DONE
crypto_shorthash_siphashx24
crypto_sign
crypto_sign_detached
crypto_sign_ed25519_pk_to_curve25519
crypto_sign_ed25519_sk_to_curve25519
crypto_sign_ed25519_sk_to_pk
crypto_sign_ed25519_sk_to_seed
crypto_sign_final_create
crypto_sign_final_verify
crypto_sign_init
crypto_sign_keypair
crypto_sign_open
crypto_sign_seed_keypair
crypto_sign_update
crypto_sign_verify_detached
crypto_stream_chacha20
crypto_stream_chacha20_ietf_xor
crypto_stream_chacha20_ietf_xor_ic
crypto_stream_chacha20_keygen
crypto_stream_chacha20_xor
crypto_stream_chacha20_xor_ic
crypto_stream_keygen
crypto_stream_xchacha20_keygen
crypto_stream_xchacha20_xor
crypto_stream_xchacha20_xor_ic
randombytes_buf
randombytes_buf_deterministic
randombytes_close
randombytes_random
randombytes_stir
randombytes_uniform
sodium_version_string
SODIUM_LIBRARY_VERSION_MAJOR
SODIUM_LIBRARY_VERSION_MINOR
crypto_aead_chacha20poly1305_ABYTES
crypto_aead_chacha20poly1305_IETF_ABYTES
crypto_aead_chacha20poly1305_IETF_KEYBYTES
crypto_aead_chacha20poly1305_IETF_MESSAGEBYTES_MAX
crypto_aead_chacha20poly1305_IETF_NPUBBYTES
crypto_aead_chacha20poly1305_IETF_NSECBYTES
crypto_aead_chacha20poly1305_KEYBYTES
crypto_aead_chacha20poly1305_MESSAGEBYTES_MAX
crypto_aead_chacha20poly1305_NPUBBYTES
crypto_aead_chacha20poly1305_NSECBYTES
crypto_aead_chacha20poly1305_ietf_ABYTES
crypto_aead_chacha20poly1305_ietf_KEYBYTES
crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX
crypto_aead_chacha20poly1305_ietf_NPUBBYTES
crypto_aead_chacha20poly1305_ietf_NSECBYTES
crypto_aead_xchacha20poly1305_IETF_ABYTES
crypto_aead_xchacha20poly1305_IETF_KEYBYTES
crypto_aead_xchacha20poly1305_IETF_MESSAGEBYTES_MAX
crypto_aead_xchacha20poly1305_IETF_NPUBBYTES
crypto_aead_xchacha20poly1305_IETF_NSECBYTES
crypto_aead_xchacha20poly1305_ietf_ABYTES
crypto_aead_xchacha20poly1305_ietf_KEYBYTES
crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX
crypto_aead_xchacha20poly1305_ietf_NPUBBYTES
crypto_aead_xchacha20poly1305_ietf_NSECBYTES
crypto_auth_BYTES
crypto_auth_KEYBYTES
crypto_auth_hmacsha256_BYTES
crypto_auth_hmacsha256_KEYBYTES
crypto_auth_hmacsha512256_BYTES
crypto_auth_hmacsha512256_KEYBYTES
crypto_auth_hmacsha512_BYTES
crypto_auth_hmacsha512_KEYBYTES
crypto_box_BEFORENMBYTES
crypto_box_MACBYTES
crypto_box_MESSAGEBYTES_MAX
crypto_box_NONCEBYTES
crypto_box_PUBLICKEYBYTES
crypto_box_SEALBYTES
crypto_box_SECRETKEYBYTES
crypto_box_SEEDBYTES
crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES
crypto_box_curve25519xchacha20poly1305_MACBYTES
crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX
crypto_box_curve25519xchacha20poly1305_NONCEBYTES
crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES
crypto_box_curve25519xchacha20poly1305_SEALBYTES
crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES
crypto_box_curve25519xchacha20poly1305_SEEDBYTES
crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES
crypto_box_curve25519xsalsa20poly1305_MACBYTES
crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX
crypto_box_curve25519xsalsa20poly1305_NONCEBYTES
crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES
crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES
crypto_box_curve25519xsalsa20poly1305_SEEDBYTES
crypto_core_ed25519_BYTES
crypto_core_ed25519_HASHBYTES
crypto_core_ed25519_NONREDUCEDSCALARBYTES
crypto_core_ed25519_SCALARBYTES
crypto_core_ed25519_UNIFORMBYTES
crypto_core_hchacha20_CONSTBYTES
crypto_core_hchacha20_INPUTBYTES
crypto_core_hchacha20_KEYBYTES
crypto_core_hchacha20_OUTPUTBYTES
crypto_core_hsalsa20_CONSTBYTES
crypto_core_hsalsa20_INPUTBYTES
crypto_core_hsalsa20_KEYBYTES
crypto_core_hsalsa20_OUTPUTBYTES
crypto_core_ristretto255_BYTES
crypto_core_ristretto255_HASHBYTES
crypto_core_ristretto255_NONREDUCEDSCALARBYTES
crypto_core_ristretto255_SCALARBYTES
crypto_core_salsa2012_CONSTBYTES
crypto_core_salsa2012_INPUTBYTES
crypto_core_salsa2012_KEYBYTES
crypto_core_salsa2012_OUTPUTBYTES
crypto_core_salsa20_CONSTBYTES
crypto_core_salsa20_INPUTBYTES
crypto_core_salsa20_KEYBYTES
crypto_core_salsa20_OUTPUTBYTES
crypto_generichash_BYTES
crypto_generichash_BYTES_MAX
crypto_generichash_BYTES_MIN
crypto_generichash_KEYBYTES
crypto_generichash_KEYBYTES_MAX
crypto_generichash_KEYBYTES_MIN
crypto_generichash_blake2b_BYTES
crypto_generichash_blake2b_BYTES_MAX
crypto_generichash_blake2b_BYTES_MIN
crypto_generichash_blake2b_KEYBYTES
crypto_generichash_blake2b_KEYBYTES_MAX
crypto_generichash_blake2b_KEYBYTES_MIN
crypto_generichash_blake2b_PERSONALBYTES
crypto_generichash_blake2b_SALTBYTES
crypto_hash_BYTES
crypto_hash_sha256_BYTES
crypto_hash_sha512_BYTES
crypto_kdf_BYTES_MAX
crypto_kdf_BYTES_MIN
crypto_kdf_CONTEXTBYTES
crypto_kdf_KEYBYTES
crypto_kdf_blake2b_BYTES_MAX
crypto_kdf_blake2b_BYTES_MIN
crypto_kdf_blake2b_CONTEXTBYTES
crypto_kdf_blake2b_KEYBYTES
crypto_kx_PUBLICKEYBYTES
crypto_kx_SECRETKEYBYTES
crypto_kx_SEEDBYTES
crypto_kx_SESSIONKEYBYTES
crypto_onetimeauth_BYTES
crypto_onetimeauth_KEYBYTES
crypto_onetimeauth_poly1305_BYTES
crypto_onetimeauth_poly1305_KEYBYTES
crypto_pwhash_ALG_ARGON2I13
crypto_pwhash_ALG_ARGON2ID13
crypto_pwhash_ALG_DEFAULT
crypto_pwhash_BYTES_MAX
crypto_pwhash_BYTES_MIN
crypto_pwhash_MEMLIMIT_INTERACTIVE
crypto_pwhash_MEMLIMIT_MAX
crypto_pwhash_MEMLIMIT_MIN
crypto_pwhash_MEMLIMIT_MODERATE
crypto_pwhash_MEMLIMIT_SENSITIVE
crypto_pwhash_OPSLIMIT_INTERACTIVE
crypto_pwhash_OPSLIMIT_MAX
crypto_pwhash_OPSLIMIT_MIN
crypto_pwhash_OPSLIMIT_MODERATE
crypto_pwhash_OPSLIMIT_SENSITIVE
crypto_pwhash_PASSWD_MAX
crypto_pwhash_PASSWD_MIN
crypto_pwhash_SALTBYTES
crypto_pwhash_STRBYTES
crypto_pwhash_argon2i_BYTES_MAX
crypto_pwhash_argon2i_BYTES_MIN
crypto_pwhash_argon2i_SALTBYTES
crypto_pwhash_argon2i_STRBYTES
crypto_pwhash_argon2id_BYTES_MAX
crypto_pwhash_argon2id_BYTES_MIN
crypto_pwhash_argon2id_SALTBYTES
crypto_pwhash_argon2id_STRBYTES
crypto_pwhash_scryptsalsa208sha256_BYTES_MAX
crypto_pwhash_scryptsalsa208sha256_BYTES_MIN
crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE
crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MAX
crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MIN
crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE
crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE
crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MAX
crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MIN
crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE
crypto_pwhash_scryptsalsa208sha256_SALTBYTES
crypto_pwhash_scryptsalsa208sha256_STRBYTES
crypto_scalarmult_BYTES
crypto_scalarmult_SCALARBYTES
crypto_scalarmult_curve25519_BYTES
crypto_scalarmult_curve25519_SCALARBYTES
crypto_scalarmult_ed25519_BYTES
crypto_scalarmult_ed25519_SCALARBYTES
crypto_scalarmult_ristretto255_BYTES
crypto_scalarmult_ristretto255_SCALARBYTES
crypto_secretbox_KEYBYTES
crypto_secretbox_MACBYTES
crypto_secretbox_MESSAGEBYTES_MAX
crypto_secretbox_NONCEBYTES
crypto_secretbox_xchacha20poly1305_KEYBYTES
crypto_secretbox_xchacha20poly1305_MACBYTES
crypto_secretbox_xchacha20poly1305_MESSAGEBYTES_MAX
crypto_secretbox_xchacha20poly1305_NONCEBYTES
crypto_secretbox_xsalsa20poly1305_KEYBYTES
crypto_secretbox_xsalsa20poly1305_MACBYTES
crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX
crypto_secretbox_xsalsa20poly1305_NONCEBYTES
crypto_secretstream_xchacha20poly1305_ABYTES
crypto_secretstream_xchacha20poly1305_HEADERBYTES
crypto_secretstream_xchacha20poly1305_KEYBYTES
crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX
crypto_secretstream_xchacha20poly1305_TAG_FINAL
crypto_secretstream_xchacha20poly1305_TAG_MESSAGE
crypto_secretstream_xchacha20poly1305_TAG_PUSH
crypto_secretstream_xchacha20poly1305_TAG_REKEY
crypto_shorthash_BYTES
crypto_shorthash_KEYBYTES
crypto_shorthash_siphash24_BYTES
crypto_shorthash_siphash24_KEYBYTES
crypto_shorthash_siphashx24_BYTES
crypto_shorthash_siphashx24_KEYBYTES
crypto_sign_BYTES
crypto_sign_MESSAGEBYTES_MAX
crypto_sign_PUBLICKEYBYTES
crypto_sign_SECRETKEYBYTES
crypto_sign_SEEDBYTES
crypto_sign_ed25519_BYTES
crypto_sign_ed25519_MESSAGEBYTES_MAX
crypto_sign_ed25519_PUBLICKEYBYTES
crypto_sign_ed25519_SECRETKEYBYTES
crypto_sign_ed25519_SEEDBYTES
crypto_stream_KEYBYTES
crypto_stream_MESSAGEBYTES_MAX
crypto_stream_NONCEBYTES
crypto_stream_chacha20_IETF_KEYBYTES
crypto_stream_chacha20_IETF_MESSAGEBYTES_MAX
crypto_stream_chacha20_IETF_NONCEBYTES
crypto_stream_chacha20_KEYBYTES
crypto_stream_chacha20_MESSAGEBYTES_MAX
crypto_stream_chacha20_NONCEBYTES
crypto_stream_chacha20_ietf_KEYBYTES
crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX
crypto_stream_chacha20_ietf_NONCEBYTES
crypto_stream_salsa2012_KEYBYTES
crypto_stream_salsa2012_MESSAGEBYTES_MAX
crypto_stream_salsa2012_NONCEBYTES
crypto_stream_salsa208_KEYBYTES
crypto_stream_salsa208_MESSAGEBYTES_MAX
crypto_stream_salsa208_NONCEBYTES
crypto_stream_salsa20_KEYBYTES
crypto_stream_salsa20_MESSAGEBYTES_MAX
crypto_stream_salsa20_NONCEBYTES
crypto_stream_xchacha20_KEYBYTES
crypto_stream_xchacha20_MESSAGEBYTES_MAX
crypto_stream_xchacha20_NONCEBYTES
crypto_stream_xsalsa20_KEYBYTES
crypto_stream_xsalsa20_MESSAGEBYTES_MAX
crypto_stream_xsalsa20_NONCEBYTES
crypto_verify_16_BYTES
crypto_verify_32_BYTES
crypto_verify_64_BYTES
SODIUM_VERSION_STRING
crypto_pwhash_STRPREFIX
crypto_pwhash_scryptsalsa208sha256_STRPREFIX

View File

@ -0,0 +1,15 @@
package com.ionspin.kotlin.crypto.shortinputhash
/**
* Created by Ugljesa Jovanovic
* ugljesa.jovanovic@ionspin.com
* on 21-Aug-2020
*/
const val crypto_shorthash_KEYBYTES = 16
const val crypto_shorthash_BYTES = 8
expect object ShortHash {
fun shortHash(data : UByteArray, key: UByteArray) : UByteArray
fun shortHashKeygen() : UByteArray
}

View File

@ -1,10 +0,0 @@
package com.ionspin.kotlin.crypto.shortinputhash
/**
* Created by Ugljesa Jovanovic
* ugljesa.jovanovic@ionspin.com
* on 21-Aug-2020
*/
object ShortInputHashing {
}

View File

@ -0,0 +1,24 @@
package com.ionspin.kotlin.crypto.util
/**
* Created by Ugljesa Jovanovic
* ugljesa.jovanovic@ionspin.com
* on 28-Aug-2020
*/
fun String.hexStringToUByteArray() : UByteArray {
return this.chunked(2).map { it.toUByte(16) }.toUByteArray()
}
fun String.encodeToUByteArray() : UByteArray{
return encodeToByteArray().asUByteArray()
}
fun UByteArray.toHexString() : String {
return this.joinToString(separator = "") {
if (it <= 0x0FU) {
"0${it.toString(16)}"
} else {
it.toString(16)
}
}
}

View File

@ -0,0 +1,41 @@
package com.ionspin.kotlin.crypto.shorthash
import com.ionspin.kotlin.crypto.LibsodiumInitializer
import com.ionspin.kotlin.crypto.shortinputhash.ShortHash
import com.ionspin.kotlin.crypto.util.encodeToUByteArray
import com.ionspin.kotlin.crypto.util.hexStringToUByteArray
import com.ionspin.kotlin.crypto.util.toHexString
import kotlin.test.Test
import kotlin.test.assertTrue
/**
* Created by Ugljesa Jovanovic
* ugljesa.jovanovic@ionspin.com
* on 28-Aug-2020
*/
class ShortHashTest {
@Test
fun testShortHash() {
LibsodiumInitializer.initializeWithCallback {
val expected = "00e5d509c14e81bb".hexStringToUByteArray()
val input = "Libsodium test"
val key = "key1key1key1key1"
val hash = ShortHash.shortHash(input.encodeToUByteArray(), key.encodeToUByteArray())
println(hash.toHexString())
assertTrue {
expected.contentEquals(hash)
}
}
}
@Test
fun testKeygen() {
LibsodiumInitializer.initializeWithCallback {
assertTrue {
val key = ShortHash.shortHashKeygen()
key.size == 16
}
}
}
}

View File

@ -35,16 +35,4 @@ fun testBlocking(block : suspend () -> Unit) {
block.startCoroutine(continuation) block.startCoroutine(continuation)
} }
fun String.encodeToUByteArray() : UByteArray{
return encodeToByteArray().asUByteArray()
}
fun UByteArray.toHexString() : String {
return this.joinToString(separator = "") {
if (it <= 0x0FU) {
"0${it.toString(16)}"
} else {
it.toString(16)
}
}
}

View File

@ -26,6 +26,11 @@ interface JsSodiumInterface {
fun crypto_generichash_final(state: dynamic, hashLength: Int) : Uint8Array fun crypto_generichash_final(state: dynamic, hashLength: Int) : Uint8Array
//Short hash
fun crypto_shorthash(data : Uint8Array, key: Uint8Array) : Uint8Array
fun crypto_shorthash_keygen() : Uint8Array
fun crypto_hash_sha256_init() : dynamic fun crypto_hash_sha256_init() : dynamic

View File

@ -0,0 +1,21 @@
package com.ionspin.kotlin.crypto.shortinputhash
import com.ionspin.kotlin.crypto.getSodium
import ext.libsodium.com.ionspin.kotlin.crypto.toUByteArray
import ext.libsodium.com.ionspin.kotlin.crypto.toUInt8Array
/**
* Created by Ugljesa Jovanovic
* ugljesa.jovanovic@ionspin.com
* on 21-Aug-2020
*/
actual object ShortHash {
actual fun shortHash(data: UByteArray, key: UByteArray): UByteArray {
return getSodium().crypto_shorthash(data.toUInt8Array(), key.toUInt8Array()).toUByteArray()
}
actual fun shortHashKeygen(): UByteArray {
return getSodium().crypto_shorthash_keygen().toUByteArray()
}
}

View File

@ -0,0 +1,25 @@
package com.ionspin.kotlin.crypto.shortinputhash
import com.ionspin.kotlin.crypto.LibsodiumInitializer.sodium
/**
* Created by Ugljesa Jovanovic
* ugljesa.jovanovic@ionspin.com
* on 21-Aug-2020
*/
actual object ShortHash {
actual fun shortHash(data: UByteArray, key: UByteArray): UByteArray {
val hashResult = UByteArray(crypto_shorthash_BYTES)
sodium.crypto_shorthash(hashResult.asByteArray(), data.asByteArray(), data.size.toLong(), key.asByteArray())
return hashResult
}
actual fun shortHashKeygen(): UByteArray {
val key = UByteArray(crypto_shorthash_KEYBYTES)
sodium.crypto_shorthash_keygen(key.asByteArray())
return key
}
}

View File

@ -0,0 +1,35 @@
package com.ionspin.kotlin.crypto.shortinputhash
import com.ionspin.kotlin.crypto.util.toPtr
import kotlinx.cinterop.convert
import kotlinx.cinterop.pin
import libsodium.crypto_shorthash
import libsodium.crypto_shorthash_keygen
/**
* Created by Ugljesa Jovanovic
* ugljesa.jovanovic@ionspin.com
* on 21-Aug-2020
*/
actual object ShortHash {
actual fun shortHash(data: UByteArray, key: UByteArray): UByteArray {
val hashResult = UByteArray(crypto_shorthash_BYTES)
val hashResultPinned = hashResult.pin()
val dataPinned = data.pin()
val keyPinned = key.pin()
crypto_shorthash(hashResultPinned.toPtr(), dataPinned.toPtr(), data.size.convert(), keyPinned.toPtr())
hashResultPinned.unpin()
dataPinned.unpin()
keyPinned.unpin()
return hashResult
}
actual fun shortHashKeygen(): UByteArray {
val keyResult = UByteArray(crypto_shorthash_KEYBYTES)
val keyResultPinned = keyResult.pin()
crypto_shorthash_keygen(keyResultPinned.toPtr())
keyResultPinned.unpin()
return keyResult
}
}

View File

@ -55,7 +55,7 @@ internal class AesCtrPure internal constructor(val aesKey: InternalAesKey, val m
* data call [decrypt] * data call [decrypt]
*/ */
fun createDecryptor(aesKey : InternalAesKey, initialCounter: UByteArray) : AesCtrPure { fun createDecryptor(aesKey : InternalAesKey, initialCounter: UByteArray) : AesCtrPure {
return AesCtrPure(aesKey, Mode.DECRYPT, initialCounter = initialCounter) return AesCtrPure(aesKey, Mode.DECRYPT, initialCounter)
} }
/** /**
* Bulk encryption, returns encrypted data and a random initial counter * Bulk encryption, returns encrypted data and a random initial counter
@ -68,8 +68,8 @@ internal class AesCtrPure internal constructor(val aesKey: InternalAesKey, val m
/** /**
* Bulk decryption, returns decrypted data * Bulk decryption, returns decrypted data
*/ */
fun decrypt(aesKey: InternalAesKey, data: UByteArray, initialCounter: UByteArray): UByteArray { fun decrypt(aesKey: InternalAesKey, data: UByteArray, initialCounter: UByteArray? = null): UByteArray {
val aesCtr = AesCtrPure(aesKey, Mode.DECRYPT, initialCounter = initialCounter) val aesCtr = AesCtrPure(aesKey = aesKey, mode = Mode.DECRYPT, initialCounter = initialCounter)
aesCtr.addData(data) aesCtr.addData(data)
return aesCtr.decrypt() return aesCtr.decrypt()
} }

View File

@ -75,7 +75,9 @@ class AesCbcTest {
assertTrue { assertTrue {
val key = "4278b840fb44aaa757c1bf04acbe1a3e" val key = "4278b840fb44aaa757c1bf04acbe1a3e"
val iv = "57f02a5c5339daeb0a2908a06ac6393f" val iv = "57f02a5c5339daeb0a2908a06ac6393f"
val cipherText = "479c89ec14bc98994e62b2c705b5014e175bd7832e7e60a1e92aac568a861eb7" val cipherText = "479c89ec14bc98994e62b2c705b5014e" +
"175bd7832e7e60a1e92aac568a861eb7" +
"fc2dc2f4a527ce39f79c56b31432c779"
val expectedPlainText = "3c888bbbb1a8eb9f3e9b87acaad986c466e2f7071c83083b8a557971918850e5" val expectedPlainText = "3c888bbbb1a8eb9f3e9b87acaad986c466e2f7071c83083b8a557971918850e5"
val aesCbc = val aesCbc =
AesCbcPure(InternalAesKey.Aes128Key(key), mode = Mode.DECRYPT, initializationVector = iv.hexStringToUByteArray()) AesCbcPure(InternalAesKey.Aes128Key(key), mode = Mode.DECRYPT, initializationVector = iv.hexStringToUByteArray())
@ -95,7 +97,9 @@ class AesCbcTest {
assertTrue { assertTrue {
val key = "4278b840fb44aaa757c1bf04acbe1a3e" val key = "4278b840fb44aaa757c1bf04acbe1a3e"
val iv = "57f02a5c5339daeb0a2908a06ac6393f" val iv = "57f02a5c5339daeb0a2908a06ac6393f"
val cipherText = "479c89ec14bc98994e62b2c705b5014e175bd7832e7e60a1e92aac568a861eb7" val cipherText = "479c89ec14bc98994e62b2c705b5014e" +
"175bd7832e7e60a1e92aac568a861eb7" +
"fc2dc2f4a527ce39f79c56b31432c779"
val expectedPlainText = "3c888bbbb1a8eb9f3e9b87acaad986c466e2f7071c83083b8a557971918850e5" val expectedPlainText = "3c888bbbb1a8eb9f3e9b87acaad986c466e2f7071c83083b8a557971918850e5"
val decrypted = AesCbcPure.decrypt(InternalAesKey.Aes128Key(key), cipherText.hexStringToUByteArray(), iv.hexStringToUByteArray()) val decrypted = AesCbcPure.decrypt(InternalAesKey.Aes128Key(key), cipherText.hexStringToUByteArray(), iv.hexStringToUByteArray())
println("Decrypted: ${decrypted.toHexString()}") println("Decrypted: ${decrypted.toHexString()}")