Adding secretstream push definition and neccessary changes
This commit is contained in:
9 files changed
+195
-31
No files matched your search
+9
-1
@@ -85,6 +85,13 @@ class FunctionDefinition(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* isActuallyAnOutputParam - drop this parameter from the generated param list and provide it as output. Param
|
||||
* will be automatically generated inside function body block
|
||||
* isStateType - provides special handling when type is a non-primitive state type
|
||||
* dropParameterFromDefinition - don't show this parameter in method definition
|
||||
*/
|
||||
class ParameterDefinition(
|
||||
val parameterName: String,
|
||||
val parameterType: GeneralTypeDefinition,
|
||||
@@ -118,7 +125,8 @@ enum class TypeDefinition(override val typeName: TypeName) : GeneralTypeDefiniti
|
||||
LONG(Long::class.asTypeName()),
|
||||
INT(Int::class.asTypeName()),
|
||||
STRING(String::class.asTypeName()),
|
||||
UNIT(Unit::class.asTypeName())
|
||||
UNIT(Unit::class.asTypeName()),
|
||||
UBYTE(UByte::class.asTypeName())
|
||||
}
|
||||
|
||||
enum class TargetPlatform {
|
||||
|
||||
+51
-14
@@ -10,7 +10,7 @@ fun ClassDefinition.defineSecretStreamFunctions() {
|
||||
"SecretStreamState",
|
||||
"com.goterl.lazycode.lazysodium.interfaces.SecretStream.State",
|
||||
"SecretStreamState",
|
||||
"crypto_hash_sha256_state"
|
||||
"crypto_secretstream_xchacha20poly1305_state"
|
||||
)
|
||||
+dataClassDef(
|
||||
"SecretStreamStateAndHeader",
|
||||
@@ -42,30 +42,35 @@ fun ClassDefinition.defineSecretStreamFunctions() {
|
||||
|
||||
val jvmSecretStreamInit = CodeBlockDefinition(
|
||||
"""
|
||||
val header = UByteArray(24)
|
||||
val state = SecretStream.State()
|
||||
sodium.crypto_secretstream_xchacha20poly1305_init_push(state, header.asByteArray(), key.asByteArray())
|
||||
return SecretStreamStateAndHeader(state, header)
|
||||
val header = UByteArray(24)
|
||||
val state = SecretStream.State()
|
||||
sodium.crypto_secretstream_xchacha20poly1305_init_push(state, header.asByteArray(), key.asByteArray())
|
||||
return SecretStreamStateAndHeader(state, header)
|
||||
""".trimIndent(),
|
||||
setOf(TargetPlatform.JVM)
|
||||
)
|
||||
|
||||
val nativeSecretStreamInit = CodeBlockDefinition(
|
||||
"""
|
||||
val state = libsodium.sodium_malloc(libsodium.crypto_secretstream_xchacha20poly1305_state.size.convert())!!
|
||||
.reinterpret<libsodium.crypto_secretstream_xchacha20poly1305_state>()
|
||||
.pointed
|
||||
val header = UByteArray(crypto_secretstream_xchacha20poly1305_HEADERBYTES.toInt()) { 0U }
|
||||
val pinnedHeader = header.pin()
|
||||
libsodium.crypto_secretstream_xchacha20poly1305_init_push(state.ptr, pinnedHeader.addressOf(0), key.toCValues())
|
||||
pinnedHeader.unpin()
|
||||
return SecretStreamStateAndHeader(state, header)
|
||||
val pinnedKey = key.pin()
|
||||
val state = sodium_malloc(libsodium.crypto_secretstream_xchacha20poly1305_state.size.convert())!!
|
||||
.reinterpret<libsodium.crypto_secretstream_xchacha20poly1305_state>()
|
||||
.pointed
|
||||
val header = UByteArray(libsodium.crypto_secretstream_xchacha20poly1305_HEADERBYTES.toInt()) { 0U }
|
||||
val pinnedHeader = header.pin()
|
||||
libsodium.crypto_secretstream_xchacha20poly1305_init_push(state.ptr, pinnedHeader.addressOf(0), pinnedKey.addressOf(0))
|
||||
pinnedHeader.unpin()
|
||||
pinnedKey.unpin()
|
||||
return SecretStreamStateAndHeader(state, header)
|
||||
""".trimIndent(),
|
||||
setOf(TargetPlatform.NATIVE)
|
||||
)
|
||||
+funcDef(
|
||||
"crypto_secretstream_xchacha20poly1305_init_push",
|
||||
returnType = TypeDefinition.ARRAY_OF_UBYTES_NO_SIZE,
|
||||
codeDocumentation = """
|
||||
Initialize a state and generate a random header. Both are returned inside `SecretStreamStateAndHeader` object
|
||||
""".trimIndent(),
|
||||
returnType = CustomTypeDefinition(withPackageName("SecretStreamStateAndHeader")),
|
||||
dynamicJsReturn = true,
|
||||
isStateCreationFunction = true,
|
||||
customCodeBlockReplacesFunctionBody = listOf(jsSecretStreamInit, jvmSecretStreamInit, nativeSecretStreamInit)
|
||||
@@ -76,5 +81,37 @@ fun ClassDefinition.defineSecretStreamFunctions() {
|
||||
)
|
||||
}
|
||||
|
||||
+funcDef(
|
||||
name = "crypto_secretstream_xchacha20poly1305_push",
|
||||
codeDocumentation = """
|
||||
Encrypt next block of data using the previously initialized state. Returns encrypted block.
|
||||
""".trimIndent(),
|
||||
returnType = TypeDefinition.ARRAY_OF_UBYTES
|
||||
) {
|
||||
+ParameterDefinition(
|
||||
"state",
|
||||
CustomTypeDefinition(withPackageName("SecretStreamState"))
|
||||
)
|
||||
+ParameterDefinition(
|
||||
"c",
|
||||
TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE,
|
||||
isActuallyAnOutputParam = true,
|
||||
dropParameterFromDefinition = true
|
||||
)
|
||||
+ParameterDefinition(
|
||||
"m",
|
||||
TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE,
|
||||
modifiesReturn = true
|
||||
)
|
||||
+ParameterDefinition(
|
||||
"ad",
|
||||
TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE
|
||||
)
|
||||
+ParameterDefinition(
|
||||
"tag",
|
||||
TypeDefinition.UBYTE
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+11
-1
@@ -77,7 +77,14 @@ object JsLibsodiumGenerator {
|
||||
throw RuntimeException("Return modifier already found")
|
||||
}
|
||||
returnModifierFound = true
|
||||
returnModifierName = paramDefinition.parameterName
|
||||
when (paramDefinition.parameterType) {
|
||||
TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE -> {
|
||||
returnModifierName = "${paramDefinition.parameterName}.size"
|
||||
}
|
||||
TypeDefinition.INT -> {
|
||||
returnModifierName = paramDefinition.parameterName
|
||||
}
|
||||
}
|
||||
}
|
||||
if (paramDefinition.isActuallyAnOutputParam) {
|
||||
actualReturnTypeFound = true
|
||||
@@ -165,6 +172,9 @@ object JsLibsodiumGenerator {
|
||||
TypeDefinition.STRING -> {
|
||||
paramsBuilder.append(paramDefinition.parameterName + separator)
|
||||
}
|
||||
TypeDefinition.UBYTE -> {
|
||||
paramsBuilder.append(paramDefinition.parameterName + separator)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+13
-3
@@ -72,7 +72,14 @@ object JvmLibsodiumGenerator {
|
||||
throw RuntimeException("Return modifier already found")
|
||||
}
|
||||
returnModifierFound = true
|
||||
returnModifierName = paramDefinition.parameterName
|
||||
when (paramDefinition.parameterType) {
|
||||
TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE -> {
|
||||
returnModifierName = "${paramDefinition.parameterName}.size"
|
||||
}
|
||||
TypeDefinition.INT -> {
|
||||
returnModifierName = paramDefinition.parameterName
|
||||
}
|
||||
}
|
||||
}
|
||||
if (paramDefinition.isActuallyAnOutputParam) {
|
||||
actualReturnParameterDefinition = paramDefinition
|
||||
@@ -114,7 +121,7 @@ object JvmLibsodiumGenerator {
|
||||
constructJvmCall.append("sodium.${methodDefinition.nativeName}")
|
||||
constructJvmCall.append(paramsToString(methodDefinition))
|
||||
methodBuilder.addStatement(constructJvmCall.toString())
|
||||
methodBuilder.addStatement("return out")
|
||||
methodBuilder.addStatement("return ${actualReturnParameterDefinition.parameterName}")
|
||||
} else {
|
||||
when (methodDefinition.returnType) {
|
||||
TypeDefinition.ARRAY_OF_UBYTES -> {
|
||||
@@ -155,7 +162,7 @@ object JvmLibsodiumGenerator {
|
||||
*/
|
||||
when (outputParam.parameterType) {
|
||||
TypeDefinition.ARRAY_OF_UBYTES, TypeDefinition.ARRAY_OF_UBYTES_NO_SIZE, TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE -> {
|
||||
methodBuilder.addStatement("val out = UByteArray($length)")
|
||||
methodBuilder.addStatement("val ${outputParam.parameterName} = UByteArray($length)")
|
||||
}
|
||||
else -> {
|
||||
throw RuntimeException("Unhandled native output param type: ${outputParam.parameterType.typeName}")
|
||||
@@ -205,6 +212,9 @@ object JvmLibsodiumGenerator {
|
||||
TypeDefinition.STRING -> {
|
||||
paramsBuilder.append(paramDefinition.parameterName + separator)
|
||||
}
|
||||
TypeDefinition.UBYTE -> {
|
||||
paramsBuilder.append(paramDefinition.parameterName + separator)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+15
-4
@@ -87,7 +87,15 @@ object NativeLibsodiumGenerator {
|
||||
throw RuntimeException("Return modifier already found")
|
||||
}
|
||||
returnModifierFound = true
|
||||
returnModifierName = paramDefinition.parameterName
|
||||
when (paramDefinition.parameterType) {
|
||||
TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE -> {
|
||||
returnModifierName = "${paramDefinition.parameterName}.size"
|
||||
}
|
||||
TypeDefinition.INT -> {
|
||||
returnModifierName = paramDefinition.parameterName
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (paramDefinition.isActuallyAnOutputParam) {
|
||||
actualReturnParameterDefinition = paramDefinition
|
||||
@@ -105,7 +113,6 @@ object NativeLibsodiumGenerator {
|
||||
}
|
||||
}
|
||||
methodBuilder.addStatement("println(\"Debug ${methodDefinition.name}\")")
|
||||
pinParams(methodDefinition, methodBuilder)
|
||||
val constructNativeCall = StringBuilder()
|
||||
if (methodDefinition.customCodeBlockReplacesFunctionBody != null) {
|
||||
for (codeBlock in methodDefinition.customCodeBlockReplacesFunctionBody.filter { it.applyOnTargets.contains(TargetPlatform.NATIVE) }) {
|
||||
@@ -113,6 +120,7 @@ object NativeLibsodiumGenerator {
|
||||
methodBuilder.addStatement(constructNativeCall.toString())
|
||||
}
|
||||
} else {
|
||||
pinParams(methodDefinition, methodBuilder)
|
||||
if (methodDefinition.isStateCreationFunction) {
|
||||
constructNativeCall.append("libsodium.${methodDefinition.nativeName}")
|
||||
constructNativeCall.append(paramsToString(methodDefinition))
|
||||
@@ -124,7 +132,7 @@ object NativeLibsodiumGenerator {
|
||||
constructNativeCall.append(paramsToString(methodDefinition))
|
||||
methodBuilder.addStatement(constructNativeCall.toString())
|
||||
unpinParams(methodDefinition, methodBuilder)
|
||||
methodBuilder.addStatement("return out")
|
||||
methodBuilder.addStatement("return ${actualReturnParameterDefinition.parameterName}")
|
||||
} else {
|
||||
when (methodDefinition.returnType) {
|
||||
TypeDefinition.ARRAY_OF_UBYTES -> {
|
||||
@@ -184,7 +192,7 @@ object NativeLibsodiumGenerator {
|
||||
*/
|
||||
when (outputParam.parameterType) {
|
||||
TypeDefinition.ARRAY_OF_UBYTES, TypeDefinition.ARRAY_OF_UBYTES_NO_SIZE, TypeDefinition.ARRAY_OF_UBYTES_LONG_SIZE -> {
|
||||
methodBuilder.addStatement("val out = UByteArray($length)")
|
||||
methodBuilder.addStatement("val ${outputParam.parameterName} = UByteArray($length)")
|
||||
}
|
||||
else -> {
|
||||
throw RuntimeException("Unhandled native output param type: ${outputParam.parameterType.typeName}")
|
||||
@@ -282,6 +290,9 @@ object NativeLibsodiumGenerator {
|
||||
TypeDefinition.STRING -> {
|
||||
paramsBuilder.append(paramDefinition.parameterName + separator)
|
||||
}
|
||||
TypeDefinition.UBYTE -> {
|
||||
paramsBuilder.append(paramDefinition.parameterName + separator)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user