Skip to content

Commit

Permalink
bug fix 2
Browse files Browse the repository at this point in the history
  • Loading branch information
Miroshka000 committed Jun 23, 2024
1 parent 961b3cf commit 8eb6e46
Showing 1 changed file with 15 additions and 21 deletions.
36 changes: 15 additions & 21 deletions src/main/java/org/allaymc/encryptmypack/EncryptMyPack.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,15 @@
import com.google.gson.stream.JsonReader;
import lombok.SneakyThrows;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
Expand Down Expand Up @@ -80,7 +73,7 @@ public static void encrypt(ZipFile inputZip, String outputName, String key) {
var contentId = findContentId(inputZip);
log("ContentId: " + contentId);

var contentEntries = new ArrayList<org.allaymc.encryptmypack.EncryptMyPack.ContentEntry>();
var contentEntries = new ArrayList<ContentEntry>();

// Delete old output
Files.deleteIfExists(Path.of(outputName));
Expand All @@ -107,7 +100,7 @@ public static void encrypt(ZipFile inputZip, String outputName, String key) {
entryKey = encryptFile(inputZip, outputStream, zipEntry);
}
log("File: " + zipEntry.getName() + ", entryKey: " + entryKey);
contentEntries.add(new org.allaymc.encryptmypack.EncryptMyPack.ContentEntry(zipEntry.getName(), entryKey));
contentEntries.add(new ContentEntry(zipEntry.getName(), entryKey));
});

generateContentsJson("contents.json", outputStream, contentId, key, contentEntries);
Expand All @@ -124,21 +117,22 @@ public static void createDirectoryRoot(ZipEntry zipEntry, ZipOutputStream output
@SneakyThrows
public static void encryptSubPack(ZipFile inputZip, ZipOutputStream zos, String subPackPath, String key, String contentId) {
log("Encrypting sub pack: " + subPackPath);
var subPackContentEntries = new ArrayList<org.allaymc.encryptmypack.EncryptMyPack.ContentEntry>();
var subPackContentEntries = new ArrayList<ContentEntry>();

// Encrypt files
inputZip.stream().forEach(zipEntry -> {
if (zipEntry.isDirectory()) return;
if (!zipEntry.getName().startsWith(subPackPath)) return;
String entryKey = encryptFile(inputZip, zos, zipEntry);
log("Sub pack file: " + zipEntry.getName() + ", entryKey: " + entryKey);
subPackContentEntries.add(new org.allaymc.encryptmypack.EncryptMyPack.ContentEntry(zipEntry.getName().substring(subPackPath.length()), entryKey));
subPackContentEntries.add(new ContentEntry(zipEntry.getName().substring(subPackPath.length()), entryKey));
});

generateContentsJson(subPackPath + "contents.json", zos, contentId, key, subPackContentEntries);
}

public static void generateContentsJson(String name, ZipOutputStream outputStream, String contentId, String key, ArrayList<org.allaymc.encryptmypack.EncryptMyPack.ContentEntry> contentEntries) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
@SneakyThrows
public static void generateContentsJson(String name, ZipOutputStream outputStream, String contentId, String key, ArrayList<ContentEntry> contentEntries) {
outputStream.putNextEntry(new ZipEntry(name));
try (var stream = new ByteArrayOutputStream()) {
stream.write(VERSION);
Expand All @@ -154,7 +148,7 @@ public static void generateContentsJson(String name, ZipOutputStream outputStrea
var cipher = Cipher.getInstance("AES/CFB8/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(key.substring(0, 16).getBytes(StandardCharsets.UTF_8)));
// Write contents.json
var contentJson = GSON.toJson(new org.allaymc.encryptmypack.EncryptMyPack.Content(contentEntries));
var contentJson = GSON.toJson(new Content(contentEntries));
paddingTo(stream, 0x100);
stream.write(cipher.doFinal(contentJson.getBytes(StandardCharsets.UTF_8)));
outputStream.write(stream.toByteArray());
Expand Down Expand Up @@ -191,7 +185,7 @@ public static String encryptFile(ZipFile inputZip, ZipOutputStream outputStream,

@SneakyThrows
public static void decrypt(ZipFile inputZip, String outputName, String key) {
org.allaymc.encryptmypack.EncryptMyPack.Content content = decryptContentsJson(inputZip, "contents.json", key);
Content content = decryptContentsJson(inputZip, "contents.json", key);

// Delete old output
Files.deleteIfExists(Path.of(outputName));
Expand Down Expand Up @@ -219,7 +213,7 @@ public static void decrypt(ZipFile inputZip, String outputName, String key) {
}

// Handle sub packs (if exist)
inputZip.stream().filter(org.allaymc.encryptmypack.EncryptMyPack::isSubPackRoot).forEach(zipEntry -> decryptSubPack(inputZip, outputStream, zipEntry.getName(), key));
inputZip.stream().filter(EncryptMyPack::isSubPackRoot).forEach(zipEntry -> decryptSubPack(inputZip, outputStream, zipEntry.getName(), key));

outputStream.close();
log("Decrypted " + inputZip.getName() + " with key " + key + " successfully");
Expand All @@ -228,7 +222,7 @@ public static void decrypt(ZipFile inputZip, String outputName, String key) {
@SneakyThrows
public static void decryptSubPack(ZipFile inputZip, ZipOutputStream zos, String subPackPath, String key) {
log("Decrypting sub pack: " + subPackPath);
org.allaymc.encryptmypack.EncryptMyPack.Content content = decryptContentsJson(inputZip, subPackPath + "contents.json", key);
Content content = decryptContentsJson(inputZip, subPackPath + "contents.json", key);

for (var contentEntry : content.content()) {
var entryPath = subPackPath + contentEntry.path();
Expand Down Expand Up @@ -260,15 +254,15 @@ public static void decryptFile(ZipOutputStream zos, byte[] bytes, String entryKe
}

@SneakyThrows
private static org.allaymc.encryptmypack.EncryptMyPack.Content decryptContentsJson(ZipFile inputZip, String subPackPath, String key) {
private static Content decryptContentsJson(ZipFile inputZip, String subPackPath, String key) {
try (var stream = inputZip.getInputStream(inputZip.getEntry(subPackPath))) {
stream.skip(0x100);
var bytes = stream.readAllBytes();
var secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
var cipher = Cipher.getInstance("AES/CFB8/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(key.substring(0, 16).getBytes(StandardCharsets.UTF_8)));
var decryptedBytes = cipher.doFinal(bytes);
org.allaymc.encryptmypack.EncryptMyPack.Content content = GSON.fromJson(new String(decryptedBytes), org.allaymc.encryptmypack.EncryptMyPack.Content.class);
Content content = GSON.fromJson(new String(decryptedBytes), Content.class);
log("Decrypted content json: " + content);
return content;
}
Expand Down Expand Up @@ -303,7 +297,7 @@ public static void paddingTo(ByteArrayOutputStream stream, int pos) {
public static String findContentId(ZipFile zip) {
var manifestEntry = zip.getEntry("manifest.json");
if (manifestEntry == null) throw new IllegalArgumentException("manifest file not exists");
org.allaymc.encryptmypack.EncryptMyPack.Manifest manifest = GSON.fromJson(new JsonReader(new InputStreamReader(zip.getInputStream(manifestEntry), StandardCharsets.UTF_8)), org.allaymc.encryptmypack.EncryptMyPack.Manifest.class);
Manifest manifest = GSON.fromJson(new JsonReader(new InputStreamReader(zip.getInputStream(manifestEntry), StandardCharsets.UTF_8)), Manifest.class);
return manifest.header.uuid;
}

Expand All @@ -323,15 +317,15 @@ public static void err(String msg) {
System.err.println(msg);
}

public record Content(List<org.allaymc.encryptmypack.EncryptMyPack.ContentEntry> content) {
public record Content(List<ContentEntry> content) {
}

public record ContentEntry(String path, String key) {
}

public static class Manifest {

public org.allaymc.encryptmypack.EncryptMyPack.Manifest.Header header;
public Header header;

public static class Header {
private String uuid;
Expand Down

0 comments on commit 8eb6e46

Please sign in to comment.