Open-source multiplayer game server compatible with the RuneScape client https://www.openrs2.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
openrs2/asm/src/main/java/dev/openrs2/asm/io/SignedJarLibraryWriter.kt

52 lines
1.8 KiB

package dev.openrs2.asm.io
import dev.openrs2.asm.classpath.ClassPath
import dev.openrs2.crypto.Pkcs12KeyStore
import dev.openrs2.util.io.DeterministicJarOutputStream
import dev.openrs2.util.io.entries
import dev.openrs2.util.io.useTempFile
import org.objectweb.asm.tree.ClassNode
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.InputStream
import java.io.OutputStream
import java.nio.file.Files
import java.util.jar.JarInputStream
import java.util.jar.Manifest
public class SignedJarLibraryWriter(
private val manifest: Manifest,
private val keyStore: Pkcs12KeyStore
) : LibraryWriter {
override fun write(output: OutputStream, classPath: ClassPath, classes: Iterable<ClassNode>) {
useTempFile(TEMP_PREFIX, JAR_SUFFIX) { unsignedJar ->
Files.newOutputStream(unsignedJar).use { unsignedOutput ->
ManifestJarLibraryWriter(manifest).write(unsignedOutput, classPath, classes)
}
ByteArrayOutputStream().use { signedOutput ->
keyStore.signJar(unsignedJar, signedOutput)
return ByteArrayInputStream(signedOutput.toByteArray()).use { signedInput ->
repack(signedInput, output)
}
}
}
}
private fun repack(input: InputStream, output: OutputStream) {
JarInputStream(input).use { jarInput ->
DeterministicJarOutputStream(output, jarInput.manifest).use { jarOutput ->
for (entry in jarInput.entries) {
jarOutput.putNextEntry(entry)
jarInput.copyTo(jarOutput)
}
}
}
}
private companion object {
private const val TEMP_PREFIX = "tmp"
private const val JAR_SUFFIX = ".jar"
}
}