Add native parameter pining

This commit is contained in:
Ugljesa Jovanovic 2020-08-02 15:13:30 +02:00 committed by Ugljesa Jovanovic
parent 97c631ecb7
commit a972b022d3
No known key found for this signature in database
GPG Key ID: 178E6DFCECCB0E0F
2 changed files with 87 additions and 20 deletions

View File

@ -16,9 +16,8 @@ object NativeLibsodiumGenerator {
fileBuilder.addImport("kotlinx.cinterop", "toCValues") fileBuilder.addImport("kotlinx.cinterop", "toCValues")
fileBuilder.addImport("kotlinx.cinterop", "convert") fileBuilder.addImport("kotlinx.cinterop", "convert")
fileBuilder.addImport("kotlinx.cinterop", "ptr") fileBuilder.addImport("kotlinx.cinterop", "ptr")
// val sodiumProperty = PropertySpec.builder("sodium", ClassName.bestGuess("com.goterl.lazycode.lazysodium.SodiumJava")) fileBuilder.addImport("kotlinx.cinterop", "pin")
// sodiumProperty.initializer(CodeBlock.of("SodiumJava()")) fileBuilder.addImport("kotlinx.cinterop", "addressOf")
// fileBuilder.addProperty(sodiumProperty.build())
for (commonClassDefinition in fileDefinition.commonClassList) { for (commonClassDefinition in fileDefinition.commonClassList) {
//Create type-aliases //Create type-aliases
commonClassDefinition.innerClasses.forEach { commonClassDefinition.innerClasses.forEach {
@ -66,6 +65,8 @@ object NativeLibsodiumGenerator {
} }
} }
pinParams(methodDefinition, methodBuilder)
if (methodDefinition.returnType == TypeDefinition.ARRAY_OF_UBYTES) { if (methodDefinition.returnType == TypeDefinition.ARRAY_OF_UBYTES) {
methodBuilder.addStatement("println(\"Debug\")") methodBuilder.addStatement("println(\"Debug\")")
val constructJvmCall = StringBuilder() val constructJvmCall = StringBuilder()
@ -85,12 +86,12 @@ object NativeLibsodiumGenerator {
} }
if (methodDefinition.returnType == TypeDefinition.UNIT) { if (methodDefinition.returnType == TypeDefinition.UNIT) {
methodBuilder.addStatement("println(\"Debug\")")
val constructJvmCall = StringBuilder()
constructJvmCall.append("libsodium.${methodDefinition.nativeName}")
constructJvmCall.append(paramsToString(methodDefinition))
methodBuilder.addStatement(constructJvmCall.toString()) val constructNativeCall = StringBuilder()
constructNativeCall.append("libsodium.${methodDefinition.nativeName}")
constructNativeCall.append(paramsToString(methodDefinition))
methodBuilder.addStatement(constructNativeCall.toString())
} }
if (methodDefinition.returnType is CustomTypeDefinition) { if (methodDefinition.returnType is CustomTypeDefinition) {
@ -102,10 +103,68 @@ object NativeLibsodiumGenerator {
methodBuilder.addStatement(constructJvmCall.toString()) methodBuilder.addStatement(constructJvmCall.toString())
} }
unpinParams(methodDefinition, methodBuilder)
methodBuilder.returns(methodDefinition.returnType.typeName) methodBuilder.returns(methodDefinition.returnType.typeName)
return methodBuilder.build() return methodBuilder.build()
} }
fun pinParams(methodDefinition: FunctionDefinition, methodBuilder: FunSpec.Builder) {
methodDefinition.parameterList.forEachIndexed { index, paramDefinition ->
if (paramDefinition.parameterType is TypeDefinition) {
when (paramDefinition.parameterType) {
TypeDefinition.ARRAY_OF_UBYTES -> {
methodBuilder.addStatement("val pinned${paramDefinition.parameterName.capitalize()} = ${paramDefinition.parameterName}.pin()")
}
TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE -> {
methodBuilder.addStatement("val pinned${paramDefinition.parameterName.capitalize()} = ${paramDefinition.parameterName}.pin()")
}
TypeDefinition.ARRAY_OF_UBYTES_NO_SIZE -> {
methodBuilder.addStatement("val pinned${paramDefinition.parameterName.capitalize()} = ${paramDefinition.parameterName}.pin()")
}
TypeDefinition.LONG -> {
}
TypeDefinition.INT -> {
}
TypeDefinition.STRING -> {
}
}
}
}
}
fun unpinParams(methodDefinition: FunctionDefinition, methodBuilder: FunSpec.Builder) {
methodDefinition.parameterList.forEachIndexed { index, paramDefinition ->
if (paramDefinition.parameterType is TypeDefinition) {
when (paramDefinition.parameterType) {
TypeDefinition.ARRAY_OF_UBYTES -> {
methodBuilder.addStatement("pinned${paramDefinition.parameterName.capitalize()}.unpin()")
}
TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE -> {
methodBuilder.addStatement("pinned${paramDefinition.parameterName.capitalize()}.unpin()")
}
TypeDefinition.ARRAY_OF_UBYTES_NO_SIZE -> {
methodBuilder.addStatement("pinned${paramDefinition.parameterName.capitalize()}.unpin()")
}
TypeDefinition.LONG -> {
}
TypeDefinition.INT -> {
}
TypeDefinition.STRING -> {
}
}
}
}
}
fun paramsToString(methodDefinition: FunctionDefinition): String { fun paramsToString(methodDefinition: FunctionDefinition): String {
val paramsBuilder = StringBuilder() val paramsBuilder = StringBuilder()
paramsBuilder.append("(") paramsBuilder.append("(")
@ -121,13 +180,13 @@ object NativeLibsodiumGenerator {
if (paramDefinition.parameterType is TypeDefinition) { if (paramDefinition.parameterType is TypeDefinition) {
when (paramDefinition.parameterType) { when (paramDefinition.parameterType) {
TypeDefinition.ARRAY_OF_UBYTES -> { TypeDefinition.ARRAY_OF_UBYTES -> {
paramsBuilder.append(paramDefinition.parameterName + ".toCValues(), " + paramDefinition.parameterName + ".size.convert()" + separator) paramsBuilder.append("pinned" + paramDefinition.parameterName.capitalize() + ".addressOf(0), "+ paramDefinition.parameterName + ".size.convert()" + separator)
} }
TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE -> { TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE -> {
paramsBuilder.append(paramDefinition.parameterName + ".toCValues(), " + paramDefinition.parameterName + ".size.convert()" + separator) paramsBuilder.append("pinned" + paramDefinition.parameterName.capitalize() + ".addressOf(0), "+ paramDefinition.parameterName + ".size.convert()" + separator)
} }
TypeDefinition.ARRAY_OF_UBYTES_NO_SIZE -> { TypeDefinition.ARRAY_OF_UBYTES_NO_SIZE -> {
paramsBuilder.append(paramDefinition.parameterName + ".toCValues()" + separator) paramsBuilder.append("pinned" + paramDefinition.parameterName.capitalize() + ".addressOf(0)" + separator)
} }
TypeDefinition.LONG -> { TypeDefinition.LONG -> {
paramsBuilder.append(paramDefinition.parameterName + ".convert()" + separator) paramsBuilder.append(paramDefinition.parameterName + ".convert()" + separator)

View File

@ -2,7 +2,9 @@ package debug.test
import kotlin.Int import kotlin.Int
import kotlin.UByteArray import kotlin.UByteArray
import kotlinx.cinterop.addressOf
import kotlinx.cinterop.convert import kotlinx.cinterop.convert
import kotlinx.cinterop.pin
import kotlinx.cinterop.ptr import kotlinx.cinterop.ptr
import kotlinx.cinterop.toCValues import kotlinx.cinterop.toCValues
import libsodium.crypto_generichash_blake2b_state import libsodium.crypto_generichash_blake2b_state
@ -22,13 +24,15 @@ actual class Crypto {
} }
actual fun crypto_hash_sha256_update(state: Sha256State, input: UByteArray) { actual fun crypto_hash_sha256_update(state: Sha256State, input: UByteArray) {
println("Debug") val pinnedInput = input.pin()
libsodium.crypto_hash_sha256_update(state.ptr, input.toCValues(), input.size.convert()) libsodium.crypto_hash_sha256_update(state.ptr, pinnedInput.addressOf(0), input.size.convert())
pinnedInput.unpin()
} }
actual fun crypto_hash_sha256_final(state: Sha256State, out: UByteArray) { actual fun crypto_hash_sha256_final(state: Sha256State, out: UByteArray) {
println("Debug") val pinnedOut = out.pin()
libsodium.crypto_hash_sha256_final(state.ptr, out.toCValues()) libsodium.crypto_hash_sha256_final(state.ptr, pinnedOut.addressOf(0))
pinnedOut.unpin()
} }
actual fun crypto_hash_sha512_init(state: Sha512State): Int { actual fun crypto_hash_sha512_init(state: Sha512State): Int {
@ -37,13 +41,15 @@ actual class Crypto {
} }
actual fun crypto_hash_sha512_update(state: Sha512State, input: UByteArray) { actual fun crypto_hash_sha512_update(state: Sha512State, input: UByteArray) {
println("Debug") val pinnedInput = input.pin()
libsodium.crypto_hash_sha512_update(state.ptr, input.toCValues(), input.size.convert()) libsodium.crypto_hash_sha512_update(state.ptr, pinnedInput.addressOf(0), input.size.convert())
pinnedInput.unpin()
} }
actual fun crypto_hash_sha512_final(state: Sha512State, out: UByteArray) { actual fun crypto_hash_sha512_final(state: Sha512State, out: UByteArray) {
println("Debug") val pinnedOut = out.pin()
libsodium.crypto_hash_sha512_final(state.ptr, out.toCValues()) libsodium.crypto_hash_sha512_final(state.ptr, pinnedOut.addressOf(0))
pinnedOut.unpin()
} }
actual fun crypto_generichash_init( actual fun crypto_generichash_init(
@ -51,8 +57,10 @@ actual class Crypto {
key: UByteArray, key: UByteArray,
outlen: Int outlen: Int
): Int { ): Int {
val pinnedKey = key.pin()
println("Debug") println("Debug")
return libsodium.crypto_generichash_init(state.ptr, key.toCValues(), key.size.convert(), return libsodium.crypto_generichash_init(state.ptr, pinnedKey.addressOf(0), key.size.convert(),
outlen.convert()) outlen.convert())
pinnedKey.unpin()
} }
} }