mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-13 07:25:03 +01:00
feature: JPK encryption and databased events
This commit is contained in:
117
common/decryption/jpk.go
Normal file
117
common/decryption/jpk.go
Normal file
@@ -0,0 +1,117 @@
|
||||
package decryption
|
||||
|
||||
/*
|
||||
This code is HEAVILY based from
|
||||
https://github.com/Chakratos/ReFrontier/blob/master/ReFrontier/Unpack.cs
|
||||
*/
|
||||
|
||||
import (
|
||||
"erupe-ce/common/byteframe"
|
||||
"io"
|
||||
)
|
||||
|
||||
var m_shiftIndex int = 0
|
||||
var m_flag byte = byte(0)
|
||||
|
||||
func UnpackSimple(data []byte) []byte {
|
||||
m_shiftIndex = 0
|
||||
m_flag = byte(0)
|
||||
|
||||
bf := byteframe.NewByteFrameFromBytes(data)
|
||||
bf.SetLE()
|
||||
header := bf.ReadUint32()
|
||||
|
||||
println("Decrypting")
|
||||
|
||||
if header == 0x1A524B4A {
|
||||
bf.Seek(0x2, io.SeekCurrent)
|
||||
jpkType := bf.ReadUint16()
|
||||
println("JPK Type: ", jpkType)
|
||||
|
||||
switch jpkType {
|
||||
case 3:
|
||||
startOffset := bf.ReadInt32()
|
||||
outSize := bf.ReadInt32()
|
||||
outBuffer := make([]byte, outSize)
|
||||
bf.Seek(int64(startOffset), io.SeekStart)
|
||||
ProcessDecode(bf, outBuffer)
|
||||
|
||||
return outBuffer
|
||||
}
|
||||
}
|
||||
|
||||
println("Skipping")
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
func ProcessDecode(data *byteframe.ByteFrame, outBuffer []byte) {
|
||||
outIndex := 0
|
||||
|
||||
for int(data.Index()) < len(data.Data()) && outIndex < len(outBuffer)-1 {
|
||||
if JPKBitshift(data) == 0 {
|
||||
outBuffer[outIndex] = ReadByte(data)
|
||||
outIndex++
|
||||
continue
|
||||
} else {
|
||||
if JPKBitshift(data) == 0 {
|
||||
len := (JPKBitshift(data) << 1) | JPKBitshift(data)
|
||||
off := ReadByte(data)
|
||||
JPKCopy(outBuffer, int(off), int(len)+3, &outIndex)
|
||||
continue
|
||||
} else {
|
||||
hi := ReadByte(data)
|
||||
lo := ReadByte(data)
|
||||
var len int = int((hi & 0xE0)) >> 5
|
||||
var off int = ((int(hi) & 0x1F) << 8) | int(lo)
|
||||
if len != 0 {
|
||||
JPKCopy(outBuffer, off, len+2, &outIndex)
|
||||
continue
|
||||
} else {
|
||||
if JPKBitshift(data) == 0 {
|
||||
len := (JPKBitshift(data) << 3) | (JPKBitshift(data) << 2) | (JPKBitshift(data) << 1) | JPKBitshift(data)
|
||||
JPKCopy(outBuffer, off, int(len)+2+8, &outIndex)
|
||||
continue
|
||||
} else {
|
||||
temp := ReadByte(data)
|
||||
if temp == 0xFF {
|
||||
for i := 0; i < off+0x1B; i++ {
|
||||
outBuffer[outIndex] = ReadByte(data)
|
||||
outIndex++
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
JPKCopy(outBuffer, off, int(temp)+0x1a, &outIndex)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func JPKBitshift(data *byteframe.ByteFrame) byte {
|
||||
m_shiftIndex--
|
||||
|
||||
if m_shiftIndex < 0 {
|
||||
m_shiftIndex = 7
|
||||
m_flag = ReadByte(data)
|
||||
}
|
||||
|
||||
return (byte)((m_flag >> m_shiftIndex) & 1)
|
||||
}
|
||||
|
||||
func JPKCopy(outBuffer []byte, offset int, length int, index *int) {
|
||||
for i := 0; i < length; i++ {
|
||||
outBuffer[*index] = outBuffer[*index-offset-1]
|
||||
*index++
|
||||
}
|
||||
}
|
||||
|
||||
func ReadByte(bf *byteframe.ByteFrame) byte {
|
||||
value := bf.ReadUint8()
|
||||
if value < 0 {
|
||||
println("Not implemented")
|
||||
}
|
||||
return byte(value)
|
||||
}
|
||||
Reference in New Issue
Block a user