Adding jvm implementation, but it's broken in lazysodium-java, so will need more work
This commit is contained in:
		
							parent
							
								
									2d63215c70
								
							
						
					
					
						commit
						cb17d75deb
					
				@ -0,0 +1,36 @@
 | 
			
		||||
package com.ionspin.kotlin.crypto.util
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by Ugljesa Jovanovic
 | 
			
		||||
 * ugljesa.jovanovic@ionspin.com
 | 
			
		||||
 * on 27-Sep-2020
 | 
			
		||||
 */
 | 
			
		||||
expect object LibsodiumRandom {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_buf() function fills size bytes starting at buf with an unpredictable sequence of bytes.
 | 
			
		||||
     */
 | 
			
		||||
    fun buf(size: Int) : UByteArray
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_buf_deterministic function stores size bytes into buf indistinguishable from random bytes without knowing seed.
 | 
			
		||||
     * For a given seed, this function will always output the same sequence. size can be up to 2^31 (~8GB) because we use kotlin arrays
 | 
			
		||||
     * and they are limited by Int primitive type
 | 
			
		||||
     * seed is randombytes_SEEDBYTES bytes long.
 | 
			
		||||
     * This function is mainly useful for writing tests, and was introduced in libsodium 1.0.12. Under the hood, it uses the ChaCha20 stream cipher.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    fun bufDeterministic(size: Int, seed: UByteArray) : UByteArray
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_random() function returns an unpredictable value between 0 and 0xffffffff (included).
 | 
			
		||||
     */
 | 
			
		||||
    fun random() : UInt
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_uniform() function returns an unpredictable value between 0 and upper_bound (excluded). Unlike r
 | 
			
		||||
     * andombytes_random() % upper_bound, it guarantees a uniform distribution of the possible output values even when
 | 
			
		||||
     * upper_bound is not a power of 2. Note that an upper_bound < 2 leaves only a single element to be chosen, namely 0
 | 
			
		||||
     */
 | 
			
		||||
    fun uniform(upperBound : UInt) : UInt
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,54 @@
 | 
			
		||||
package com.ionspin.kotlin.crypto.util
 | 
			
		||||
 | 
			
		||||
import com.ionspin.kotlin.crypto.LibsodiumInitializer.sodium
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by Ugljesa Jovanovic
 | 
			
		||||
 * ugljesa.jovanovic@ionspin.com
 | 
			
		||||
 * on 27-Sep-2020
 | 
			
		||||
 */
 | 
			
		||||
actual object LibsodiumRandom {
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_buf() function fills size bytes starting at buf with an unpredictable sequence of bytes.
 | 
			
		||||
     */
 | 
			
		||||
    actual fun buf(size: Int): UByteArray {
 | 
			
		||||
        val result = ByteArray(size)
 | 
			
		||||
        sodium.randombytes_buf(result, size)
 | 
			
		||||
        return result.asUByteArray()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_buf_deterministic function stores size bytes into buf indistinguishable from random bytes without knowing seed.
 | 
			
		||||
     * For a given seed, this function will always output the same sequence. size can be up to 2^31 (~8GB) because we use kotlin arrays
 | 
			
		||||
     * and they are limited by Int primitive type
 | 
			
		||||
     * seed is randombytes_SEEDBYTES bytes long.
 | 
			
		||||
     * This function is mainly useful for writing tests, and was introduced in libsodium 1.0.12. Under the hood, it uses the ChaCha20 stream cipher.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    actual fun bufDeterministic(size: Int, seed: UByteArray): UByteArray {
 | 
			
		||||
        val result = ByteArray(size)
 | 
			
		||||
        sodium.randombytes_buf(result, size, seed.asByteArray())
 | 
			
		||||
        return result.asUByteArray()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_random() function returns an unpredictable value between 0 and 0xffffffff (included).
 | 
			
		||||
     */
 | 
			
		||||
    actual fun random(): UInt {
 | 
			
		||||
        //Broken in lazysodium-java https://github.com/terl/lazysodium-java/issues/86
 | 
			
		||||
        TODO()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_uniform() function returns an unpredictable value between 0 and upper_bound (excluded). Unlike r
 | 
			
		||||
     * andombytes_random() % upper_bound, it guarantees a uniform distribution of the possible output values even when
 | 
			
		||||
     * upper_bound is not a power of 2. Note that an upper_bound < 2 leaves only a single element to be chosen, namely 0
 | 
			
		||||
     */
 | 
			
		||||
    actual fun uniform(upperBound: UInt): UInt {
 | 
			
		||||
        //Broken in lazysodium-java https://github.com/terl/lazysodium-java/issues/86
 | 
			
		||||
        TODO("not implemented yet")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,63 @@
 | 
			
		||||
package com.ionspin.kotlin.crypto.util
 | 
			
		||||
 | 
			
		||||
import kotlinx.cinterop.convert
 | 
			
		||||
import kotlinx.cinterop.pin
 | 
			
		||||
import libsodium.randombytes_buf
 | 
			
		||||
import libsodium.randombytes_buf_deterministic
 | 
			
		||||
import libsodium.randombytes_close
 | 
			
		||||
import libsodium.randombytes_random
 | 
			
		||||
import libsodium.randombytes_stir
 | 
			
		||||
import libsodium.randombytes_uniform
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by Ugljesa Jovanovic
 | 
			
		||||
 * ugljesa.jovanovic@ionspin.com
 | 
			
		||||
 * on 27-Sep-2020
 | 
			
		||||
 */
 | 
			
		||||
actual object LibsodiumRandom {
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_buf() function fills size bytes starting at buf with an unpredictable sequence of bytes.
 | 
			
		||||
     */
 | 
			
		||||
    actual fun buf(size: Int): UByteArray {
 | 
			
		||||
        val result = UByteArray(size)
 | 
			
		||||
        val resultPinned = result.pin()
 | 
			
		||||
        randombytes_buf(resultPinned.toPtr(), size.convert())
 | 
			
		||||
        resultPinned.unpin()
 | 
			
		||||
        return result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_buf_deterministic function stores size bytes into buf indistinguishable from random bytes without knowing seed.
 | 
			
		||||
     * For a given seed, this function will always output the same sequence. size can be up to 2^31 (~8GB) because we use kotlin arrays
 | 
			
		||||
     * and they are limited by Int primitive type
 | 
			
		||||
     * seed is randombytes_SEEDBYTES bytes long.
 | 
			
		||||
     * This function is mainly useful for writing tests, and was introduced in libsodium 1.0.12. Under the hood, it uses the ChaCha20 stream cipher.
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    actual fun bufDeterministic(size: Int, seed: UByteArray): UByteArray {
 | 
			
		||||
        val result = UByteArray(size)
 | 
			
		||||
        val resultPinned = result.pin()
 | 
			
		||||
        val seedPinned = seed.pin()
 | 
			
		||||
        randombytes_buf_deterministic(resultPinned.toPtr(), size.convert(), seedPinned.toPtr())
 | 
			
		||||
        resultPinned.unpin()
 | 
			
		||||
        seedPinned.unpin()
 | 
			
		||||
        return result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_random() function returns an unpredictable value between 0 and 0xffffffff (included).
 | 
			
		||||
     */
 | 
			
		||||
    actual fun random(): UInt {
 | 
			
		||||
        return randombytes_random()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The randombytes_uniform() function returns an unpredictable value between 0 and upper_bound (excluded). Unlike r
 | 
			
		||||
     * andombytes_random() % upper_bound, it guarantees a uniform distribution of the possible output values even when
 | 
			
		||||
     * upper_bound is not a power of 2. Note that an upper_bound < 2 leaves only a single element to be chosen, namely 0
 | 
			
		||||
     */
 | 
			
		||||
    actual fun uniform(upperBound: UInt): UInt {
 | 
			
		||||
        return randombytes_uniform(upperBound)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user