libsodium bindings for Kotlin
npm install @datkt/sodiumsodium
======
libsodium bindings for Kotlin/Native.
The datkt.sodium package an be installed with various package managers.
``sh`
$ npm install @datkt/sodium
* Kotlin/Native and the
konanc command line program.
* make
`shnode_modules/Compile a program in 'main.kt' and link sodium.klib found in
`
$ konanc -r node_modules/@datkt -l sodium/sodium main.kt
where main.kt might be
`kotlin
import datkt.sodium.* // entire libsodium API
import kotlinx.cinterop.* // exposes types needed for interop
fun main(args: Array
if (0 != sodium_init()) {
throw Error("Failed to initialize libsodium")
}
}
``
`kotlin
import kotlinx.cinterop.*
import datkt.sodium.sodium_init
import datkt.sodium.randombytes_buf
import datkt.sodium.randombytes_random
import datkt.sodium.randombytes_uniform
fun main(args: Array
val rc = sodium_init()
if (0 != rc) {
throw Error("sodium_init() != 0")
}
println("${randombytes_random()} = randombytes_random()")
println("${randombytes_uniform(37)} = randombytes_uniform(37)")
var buffer = ByteArray(16)
buffer.usePinned { pinned ->
randombytes_buf(pinned.addressOf(0), buffer.size.convert())
}
println("${toHexString(buffer)} = randombytes_buf(ByteArray(16), 16)")
}
val table = "0123456789abcdef".toCharArray()
fun toHexString(bytes: ByteArray): String {
var output = CharArray(2 * bytes.size)
for (i in bytes.indices) {
val j = (bytes[i].toInt() and 0xff).toInt()
output[2 * i] = table[j ushr 4]
output[1 + 2 * i] = table[j and 0x0f]
}
return String(output)
}
`
This package binds libsodiums entire API and provides an
interop
API for Kotlin and can be imported from the sodium package. Forcrypto_generichash()
example, the with the following C function
signature:
`c`
int crypto_generichash(unsigned char *out,
size_t outlen,
const unsigned char *in,
unsigned long long inlen,
const unsigned char *key,
size_t keylen);
translates to the following Kotlin function signature:
`kotlinin
fun crypto_generichash(out: CValuesRef
outlen: size_t,
: CValuesRef`
inlen: ULong,
key: CValuesRef
keylen: size_t): Int;
and can be called in Kotlin like:
`kotlin
val buffer = ByteArray(crypto_generichash_BYTES.toInt())
val message = "hello"
buffer.usePinned { pinned ->
crypto_generichash(
pinned.addressOf(0) as CValuesRef
buffer.size.convert(),
message.cstr as CValuesRef
message.length.convert(),
null, // key
0 // key size
)
}
`
The sodium package can be built from source into various targets.
sodium.klib, a Kotlin library that can be linked with konanc can be
built from source.
`sh`
$ make klib
which will produce build/lib/sodium.klib. The library can be installedklib
with by running make install
libsodium.a, a static library that can be linked with konanc can be
built from source.
`sh`
$ make static
which will produce build/lib/libsodium.a and C header files inbuild/include. The library can be installed into your system bymake install
running . The path prefix can be set by defining thePREFIX environment or make variable. It defaults toPREFIX=/usr/local`
* https://libsodium.gitbook.io/doc
* https://github.com/jedisct1/libsodium
* https://github.com/sodium-friends/sodium-native
MIT