added some CPE tests
This commit is contained in:
parent
53ed1d1e83
commit
02a895521c
4 changed files with 44 additions and 264 deletions
130
motolol/cp/cp.go
130
motolol/cp/cp.go
|
@ -72,133 +72,3 @@ func (r *CPReader) Test() (err error) {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
/*
|
||||
func (r *CPEReader) readFileMetadata() (GMAFileMetadata, error) {
|
||||
metadata := GMAFileMetadata{}
|
||||
|
||||
// Read the file name
|
||||
fileName, err := r.gmaStreamReader.ReadString(byte(0))
|
||||
if err != nil {
|
||||
return metadata, err
|
||||
}
|
||||
//fmt.Printf("bufio ReadString(byte(0)) = len(%d) data=%x\n", len(fileName), fileName)
|
||||
|
||||
fileName = fileName[:len(fileName)-1] // remove nullbyte that causes go string fuckyness
|
||||
r.cursorOffset += uint32(len(fileName) + 1) // Add name length + null byte
|
||||
metadata.FileName = fileName
|
||||
|
||||
// Read the file size
|
||||
fileSizeBytes := make([]byte, 8)
|
||||
_, err = io.ReadFull(r.gmaStreamReader, fileSizeBytes)
|
||||
if err != nil {
|
||||
return metadata, err
|
||||
}
|
||||
r.cursorOffset += 8
|
||||
//fmt.Printf("bufio Read([]byte(4)]) fileSizeBytes = bytesRead(%d) data=%x\n", bytesRead, fileSizeBytes)
|
||||
metadata.FileSize = int64(binary.LittleEndian.Uint64(fileSizeBytes))
|
||||
|
||||
// Read the file crc
|
||||
crcBytes := make([]byte, 4)
|
||||
_, err = io.ReadFull(r.gmaStreamReader, crcBytes)
|
||||
if err != nil {
|
||||
return metadata, err
|
||||
}
|
||||
r.cursorOffset += 4
|
||||
//fmt.Printf("bufio Read([]byte(4)]) crcBytes = bytesRead(%d) data=%x\n", bytesRead, crcBytes)
|
||||
metadata.CRC = binary.LittleEndian.Uint32(crcBytes)
|
||||
|
||||
// Read the next type
|
||||
nextTypeBytes := make([]byte, 4)
|
||||
_, err = io.ReadFull(r.gmaStreamReader, nextTypeBytes)
|
||||
if err != nil {
|
||||
return metadata, err
|
||||
}
|
||||
r.cursorOffset += 4
|
||||
metadata.NextType = binary.LittleEndian.Uint32(nextTypeBytes)
|
||||
//fmt.Printf("bufio Read([]byte(4)]) nextTypeBytes = bytesRead(%d) data=%x\n", bytesRead, nextTypeBytes)
|
||||
|
||||
return metadata, nil
|
||||
}
|
||||
func (r *CPEReader) ReadAddonCRC(lastOffset int64) (crc uint32, err error) {
|
||||
|
||||
limitReader := io.NewSectionReader(r.FileHandle, int64(r.cursorOffset)+lastOffset, int64(4))
|
||||
|
||||
crcBytes := make([]byte, 4)
|
||||
_, err = limitReader.Read(crcBytes)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
r.cursorOffset += 4
|
||||
CRC := binary.LittleEndian.Uint32(crcBytes)
|
||||
return CRC, nil
|
||||
}
|
||||
|
||||
func (r *CPEReader) ReadFiles() (firstType int32, files []GMAFileMetadata, err error) {
|
||||
// read nType 4byte
|
||||
firstTypeBytes := make([]byte, 4)
|
||||
_, err = r.gmaStreamReader.Read(firstTypeBytes)
|
||||
if err != nil {
|
||||
return 0, files, err
|
||||
}
|
||||
r.cursorOffset += 4
|
||||
firstType = int32(binary.LittleEndian.Uint32(firstTypeBytes))
|
||||
|
||||
if firstType == 0 {
|
||||
return 0, files, nil
|
||||
}
|
||||
fileOffset := int64(0)
|
||||
fileNumber := int32(1)
|
||||
for {
|
||||
fileMeta, err := r.readFileMetadata()
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
return firstType, files, err
|
||||
}
|
||||
fileMeta.FileNumber = fileNumber
|
||||
fileMeta.Offset = fileOffset
|
||||
//fmt.Printf("%s CRC: %d Offset: %d Size: %d\n", fileMeta.FileName, fileMeta.CRC, fileMeta.Offset, fileMeta.FileSize)
|
||||
//fmt.Printf("[% x]\n", fileMeta.FileName)
|
||||
files = append(files, fileMeta)
|
||||
fileOffset += fileMeta.FileSize
|
||||
fileNumber++
|
||||
if fileMeta.NextType == 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return firstType, files, nil
|
||||
}
|
||||
func (r *CPEReader) GetOffset() (offset uint32) {
|
||||
return r.cursorOffset
|
||||
}
|
||||
func (r *CPEReader) ExtractFileTo(fileMeta GMAFileMetadata, writer io.Writer) (extractMeta GMAExtractionMeta, err error) {
|
||||
extractMeta.OriginalMeta = fileMeta
|
||||
// Seek to the specified offset in the reader
|
||||
limitReader := io.NewSectionReader(r.FileHandle, int64(r.cursorOffset)+fileMeta.Offset, int64(fileMeta.FileSize))
|
||||
// Copy the specified length of data from the reader to the output file
|
||||
buf := bytes.NewBuffer(nil)
|
||||
_, err = io.CopyN(buf, limitReader, int64(fileMeta.FileSize))
|
||||
if err != nil {
|
||||
return extractMeta, err
|
||||
}
|
||||
shaHasher := sha256.New()
|
||||
|
||||
extractMeta.ExtractedCRC = crc32.Checksum(buf.Bytes(), crc32.MakeTable(crc32.IEEE))
|
||||
shaHasher.Write(buf.Bytes())
|
||||
extractMeta.ExtractedSHA256 = fmt.Sprintf("%x", shaHasher.Sum(nil))
|
||||
buf.WriteTo(writer)
|
||||
|
||||
return extractMeta, nil
|
||||
}
|
||||
func (r *CPEReader) GetSHA256() (hash string, err error) {
|
||||
shaHasher := sha256.New()
|
||||
if _, err := io.Copy(shaHasher, r.FileHandle); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return fmt.Sprintf("%x", shaHasher.Sum(nil)), nil
|
||||
}
|
||||
|
||||
*/
|
||||
|
|
|
@ -3,6 +3,6 @@ package cp
|
|||
type Table struct {
|
||||
}
|
||||
|
||||
func NewTable(fileName string) (_ CPReader, err error) {
|
||||
return CPReader{}.NewReader(fileName)
|
||||
}
|
||||
// func NewTable(fileName string) (_ CPReader, err error) {
|
||||
// return CPReader{}.NewReader(fileName)
|
||||
// }
|
||||
|
|
|
@ -116,136 +116,5 @@ func (r *CPEReader) ReadData() (err error) {
|
|||
return err
|
||||
}
|
||||
r.Metadata.Segments[nextSegment.Name] = nextSegment
|
||||
//fmt.Printf("Segment Found: %s (%d bytes)\n", nextSegment.Name, nextSegment.Size)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
func (r *CPEReader) readFileMetadata() (GMAFileMetadata, error) {
|
||||
metadata := GMAFileMetadata{}
|
||||
|
||||
// Read the file name
|
||||
fileName, err := r.gmaStreamReader.ReadString(byte(0))
|
||||
if err != nil {
|
||||
return metadata, err
|
||||
}
|
||||
//fmt.Printf("bufio ReadString(byte(0)) = len(%d) data=%x\n", len(fileName), fileName)
|
||||
|
||||
fileName = fileName[:len(fileName)-1] // remove nullbyte that causes go string fuckyness
|
||||
r.cursorOffset += uint32(len(fileName) + 1) // Add name length + null byte
|
||||
metadata.FileName = fileName
|
||||
|
||||
// Read the file size
|
||||
fileSizeBytes := make([]byte, 8)
|
||||
_, err = io.ReadFull(r.gmaStreamReader, fileSizeBytes)
|
||||
if err != nil {
|
||||
return metadata, err
|
||||
}
|
||||
r.cursorOffset += 8
|
||||
//fmt.Printf("bufio Read([]byte(4)]) fileSizeBytes = bytesRead(%d) data=%x\n", bytesRead, fileSizeBytes)
|
||||
metadata.FileSize = int64(binary.LittleEndian.Uint64(fileSizeBytes))
|
||||
|
||||
// Read the file crc
|
||||
crcBytes := make([]byte, 4)
|
||||
_, err = io.ReadFull(r.gmaStreamReader, crcBytes)
|
||||
if err != nil {
|
||||
return metadata, err
|
||||
}
|
||||
r.cursorOffset += 4
|
||||
//fmt.Printf("bufio Read([]byte(4)]) crcBytes = bytesRead(%d) data=%x\n", bytesRead, crcBytes)
|
||||
metadata.CRC = binary.LittleEndian.Uint32(crcBytes)
|
||||
|
||||
// Read the next type
|
||||
nextTypeBytes := make([]byte, 4)
|
||||
_, err = io.ReadFull(r.gmaStreamReader, nextTypeBytes)
|
||||
if err != nil {
|
||||
return metadata, err
|
||||
}
|
||||
r.cursorOffset += 4
|
||||
metadata.NextType = binary.LittleEndian.Uint32(nextTypeBytes)
|
||||
//fmt.Printf("bufio Read([]byte(4)]) nextTypeBytes = bytesRead(%d) data=%x\n", bytesRead, nextTypeBytes)
|
||||
|
||||
return metadata, nil
|
||||
}
|
||||
func (r *CPEReader) ReadAddonCRC(lastOffset int64) (crc uint32, err error) {
|
||||
|
||||
limitReader := io.NewSectionReader(r.FileHandle, int64(r.cursorOffset)+lastOffset, int64(4))
|
||||
|
||||
crcBytes := make([]byte, 4)
|
||||
_, err = limitReader.Read(crcBytes)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
r.cursorOffset += 4
|
||||
CRC := binary.LittleEndian.Uint32(crcBytes)
|
||||
return CRC, nil
|
||||
}
|
||||
|
||||
func (r *CPEReader) ReadFiles() (firstType int32, files []GMAFileMetadata, err error) {
|
||||
// read nType 4byte
|
||||
firstTypeBytes := make([]byte, 4)
|
||||
_, err = r.gmaStreamReader.Read(firstTypeBytes)
|
||||
if err != nil {
|
||||
return 0, files, err
|
||||
}
|
||||
r.cursorOffset += 4
|
||||
firstType = int32(binary.LittleEndian.Uint32(firstTypeBytes))
|
||||
|
||||
if firstType == 0 {
|
||||
return 0, files, nil
|
||||
}
|
||||
fileOffset := int64(0)
|
||||
fileNumber := int32(1)
|
||||
for {
|
||||
fileMeta, err := r.readFileMetadata()
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
return firstType, files, err
|
||||
}
|
||||
fileMeta.FileNumber = fileNumber
|
||||
fileMeta.Offset = fileOffset
|
||||
//fmt.Printf("%s CRC: %d Offset: %d Size: %d\n", fileMeta.FileName, fileMeta.CRC, fileMeta.Offset, fileMeta.FileSize)
|
||||
//fmt.Printf("[% x]\n", fileMeta.FileName)
|
||||
files = append(files, fileMeta)
|
||||
fileOffset += fileMeta.FileSize
|
||||
fileNumber++
|
||||
if fileMeta.NextType == 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return firstType, files, nil
|
||||
}
|
||||
func (r *CPEReader) GetOffset() (offset uint32) {
|
||||
return r.cursorOffset
|
||||
}
|
||||
func (r *CPEReader) ExtractFileTo(fileMeta GMAFileMetadata, writer io.Writer) (extractMeta GMAExtractionMeta, err error) {
|
||||
extractMeta.OriginalMeta = fileMeta
|
||||
// Seek to the specified offset in the reader
|
||||
limitReader := io.NewSectionReader(r.FileHandle, int64(r.cursorOffset)+fileMeta.Offset, int64(fileMeta.FileSize))
|
||||
// Copy the specified length of data from the reader to the output file
|
||||
buf := bytes.NewBuffer(nil)
|
||||
_, err = io.CopyN(buf, limitReader, int64(fileMeta.FileSize))
|
||||
if err != nil {
|
||||
return extractMeta, err
|
||||
}
|
||||
shaHasher := sha256.New()
|
||||
|
||||
extractMeta.ExtractedCRC = crc32.Checksum(buf.Bytes(), crc32.MakeTable(crc32.IEEE))
|
||||
shaHasher.Write(buf.Bytes())
|
||||
extractMeta.ExtractedSHA256 = fmt.Sprintf("%x", shaHasher.Sum(nil))
|
||||
buf.WriteTo(writer)
|
||||
|
||||
return extractMeta, nil
|
||||
}
|
||||
func (r *CPEReader) GetSHA256() (hash string, err error) {
|
||||
shaHasher := sha256.New()
|
||||
if _, err := io.Copy(shaHasher, r.FileHandle); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return fmt.Sprintf("%x", shaHasher.Sum(nil)), nil
|
||||
}
|
||||
|
||||
*/
|
||||
|
|
41
motolol/motolol.go
Normal file
41
motolol/motolol.go
Normal file
|
@ -0,0 +1,41 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.cheetah.cat/cheetah/moto-flash-data/motolol/cpe"
|
||||
)
|
||||
|
||||
func main() {
|
||||
//, err := cpe.NewReader("../testdata/20230825-2021-dmosck-SN[121TUL1221]_TEI[00016C9C2238810]_ISSI[133705]_CP[1020]_SW[R35.010.9426]_USB1.cpe")
|
||||
test, err := cpe.NewReader("../testdata/20231023-Transceiver-pei115200_SN[938TSG4891]_TEI[000148231294920]_ISSI[133706]_CP[1511]_SW[R27.000.9840]_USB2.cpe")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer test.Close()
|
||||
|
||||
err = test.ValidateHeader()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
err = test.ReadData()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for _, seg := range test.Metadata.Segments {
|
||||
fmt.Printf("Segment Found: %s (%d bytes)\n", seg.Name, seg.Size)
|
||||
}
|
||||
fmt.Println("all alright")
|
||||
|
||||
// cp, err := cp.NewReader("./output.cpe.test")
|
||||
// if err != nil {
|
||||
// panic(err)
|
||||
// }
|
||||
// defer cp.Close()
|
||||
|
||||
// err = cp.Test()
|
||||
// if err != nil {
|
||||
// panic(err)
|
||||
// }
|
||||
|
||||
}
|
Loading…
Add table
Reference in a new issue