Refactor rres

This commit is contained in:
Milan Nikolic 2017-11-29 11:58:55 +01:00
parent 8cd17bd7a9
commit e9123b8b25
2 changed files with 94 additions and 74 deletions

View file

@ -68,84 +68,18 @@ func LoadResource(reader io.ReadSeeker, rresID int, key []byte) (data rres.Data)
reader.Read(b) reader.Read(b)
// Uncompress data // Uncompress data
switch infoHeader.CompType { data.Data, err = uncompress(b, int(infoHeader.CompType), int(infoHeader.UncompSize))
case rres.CompNone: if err != nil {
data.Data = b TraceLog(LogWarning, "[ID %d] %v", infoHeader.ID, err)
case rres.CompDeflate:
r := flate.NewReader(bytes.NewReader(b))
u := make([]byte, infoHeader.UncompSize)
r.Read(u)
data.Data = u
r.Close()
case rres.CompLZ4:
r := lz4.NewReader(bytes.NewReader(b))
u := make([]byte, infoHeader.UncompSize)
r.Read(u)
data.Data = u
case rres.CompLZMA2:
r, err := xz.NewReader(bytes.NewReader(b))
if err != nil {
TraceLog(LogWarning, "[ID %d] %v", infoHeader.ID, err)
}
u := make([]byte, infoHeader.UncompSize)
r.Read(u)
data.Data = u
case rres.CompBZIP2:
r, err := bzip2.NewReader(bytes.NewReader(b), &bzip2.ReaderConfig{})
if err != nil {
TraceLog(LogWarning, "[ID %d] %v", infoHeader.ID, err)
}
u := make([]byte, infoHeader.UncompSize)
r.Read(u)
data.Data = u
} }
// Decrypt data // Decrypt data
switch infoHeader.CryptoType { data.Data, err = decrypt(key, data.Data, int(infoHeader.CryptoType))
case rres.CryptoXOR: if err != nil {
c, err := encrypt.NewXor(string(key)) TraceLog(LogWarning, "[ID %d] %v", infoHeader.ID, err)
if err != nil {
TraceLog(LogWarning, "[ID %d] %v", infoHeader.ID, err)
}
b := c.Encode(data.Data)
data.Data = b
case rres.CryptoAES:
b, err := decryptAES(key, data.Data)
if err != nil {
TraceLog(LogWarning, "[ID %d] %v", infoHeader.ID, err)
}
data.Data = b
case rres.Crypto3DES:
b, err := decrypt3DES(key, data.Data)
if err != nil {
TraceLog(LogWarning, "[ID %d] %v", infoHeader.ID, err)
}
data.Data = b
case rres.CryptoBlowfish:
b, err := decryptBlowfish(key, data.Data)
if err != nil {
TraceLog(LogWarning, "[ID %d] %v", infoHeader.ID, err)
}
data.Data = b
case rres.CryptoXTEA:
b, err := decryptXTEA(key, data.Data)
if err != nil {
TraceLog(LogWarning, "[ID %d] %v", infoHeader.ID, err)
}
data.Data = b
} }
if data.Data != nil { if data.Data != nil && len(data.Data) == int(infoHeader.UncompSize) {
TraceLog(LogInfo, "[ID %d] Resource data loaded successfully", infoHeader.ID) TraceLog(LogInfo, "[ID %d] Resource data loaded successfully", infoHeader.ID)
} }
} else { } else {
@ -161,6 +95,92 @@ func LoadResource(reader io.ReadSeeker, rresID int, key []byte) (data rres.Data)
return return
} }
// decrypt data
func decrypt(key, data []byte, cryptoType int) ([]byte, error) {
switch cryptoType {
case rres.CryptoXOR:
c, err := encrypt.NewXor(string(key))
if err != nil {
return nil, err
}
b := c.Encode(data)
return b, nil
case rres.CryptoAES:
b, err := decryptAES(key, data)
if err != nil {
return nil, err
}
return b, nil
case rres.Crypto3DES:
b, err := decrypt3DES(key, data)
if err != nil {
return nil, err
}
return b, nil
case rres.CryptoBlowfish:
b, err := decryptBlowfish(key, data)
if err != nil {
return nil, err
}
return b, nil
case rres.CryptoXTEA:
b, err := decryptXTEA(key, data)
if err != nil {
return nil, err
}
return b, nil
default:
return data, nil
}
}
// uncompress data
func uncompress(data []byte, compType, uncompSize int) ([]byte, error) {
switch compType {
case rres.CompNone:
return data, nil
case rres.CompDeflate:
r := flate.NewReader(bytes.NewReader(data))
u := make([]byte, uncompSize)
r.Read(u)
r.Close()
return u, nil
case rres.CompLZ4:
r := lz4.NewReader(bytes.NewReader(data))
u := make([]byte, uncompSize)
r.Read(u)
return u, nil
case rres.CompLZMA2:
r, err := xz.NewReader(bytes.NewReader(data))
if err != nil {
return nil, err
}
u := make([]byte, uncompSize)
r.Read(u)
return u, nil
case rres.CompBZIP2:
r, err := bzip2.NewReader(bytes.NewReader(data), &bzip2.ReaderConfig{})
if err != nil {
return nil, err
}
u := make([]byte, uncompSize)
r.Read(u)
return u, nil
default:
return data, nil
}
}
// unpad // unpad
func unpad(src []byte) ([]byte, error) { func unpad(src []byte) ([]byte, error) {
length := len(src) length := len(src)

View file

@ -442,7 +442,7 @@ func compress(data []byte, compType int) ([]byte, error) {
case rres.CompDeflate: case rres.CompDeflate:
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
w, err := flate.NewWriter(buf, flate.BestCompression) w, err := flate.NewWriter(buf, flate.DefaultCompression)
if err != nil { if err != nil {
return nil, err return nil, err
} }