kalium
kalium copied to clipboard
Exception During Initialization (Windows)
Kalium with libsodium 1.0.15 & 1.0.16 is broken, due to incorrect string handling in jnr-ffi.
- libsodium stores the version string in 1.0.15 as
1.0.15\0\0xsalsa20....(https://github.com/jedisct1/libsodium/issues/665) - jnr-ffi does not correctly read NULL-terminated static strings from binaries - its look for a double null (
\0\0\0\0). (https://github.com/jnr/jnr-ffi/issues/108)
As a result, sodium_lib_version returns "1.0.15\0\0xsalsa20", and checkVersion fails because it tries to convert 15\0\0xsalsa20 to an integer.
Short of fixing jnr-ffi, Kalium could update its regex when parsing the input string to avoid this bug.
The exception thrown is:
Exception in thread "main" java.lang.NumberFormatException: For input string: "16 xsalsa20"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.<init>(Unknown Sour
at org.abstractj.kalium.NaCl.checkVersion(NaCl.java:66)
at org.abstractj.kalium.NaCl.sodium(NaCl.java:30)
Here is a short test program that demonstrates the problem (requires using 1.0.16 on Windows). Assumes jUnit:
import org.abstractj.kalium.NaCl;
import org.abstractj.kalium.NaCl.Sodium;
import org.junit.*;
import static org.junit.Assert.*;
class Test {
@Test
public void testSodiumVersion() {
Sodium x = jnr.ffi.LibraryLoader.create(Sodium.class).load("libsodium");
assertEquals(x.sodium_version_string(), "1.0.16");
}
}
Can be fixed by adding an @Encoding annotation (from jnr-ffi) to the method:
@Encoding("US-ASCII")
String sodium_version_string();
@m4dc4p Works like a charm. It fixed an issue with parsing a Json response from C/C++ library