Files
tesla_firmware_decrypt/pkg/decrypt.go
Denys Vitali 2a3be10d7e initial commit
2022-11-18 11:05:20 +01:00

39 lines
801 B
Go

package decrypt
import (
"encoding/binary"
"fmt"
"golang.org/x/crypto/salsa20"
"io"
)
type Decrypt struct {
Key []byte
}
func (d *Decrypt) Decrypt(reader io.Reader, writer io.Writer) error {
if len(d.Key) != 32 {
return fmt.Errorf("key must be 32 bytes long")
}
blockNumber := 0
for {
nonceBytes := make([]byte, 24)
binary.LittleEndian.PutUint64(nonceBytes, uint64(blockNumber))
block := make([]byte, 256)
_, err := reader.Read(block)
if err == io.EOF {
return nil
}
if err != nil {
return fmt.Errorf("unable to read file: %v", err)
}
outBlock := make([]byte, 256)
salsa20.XORKeyStream(outBlock, block, nonceBytes, (*[32]byte)(d.Key))
blockNumber++
_, err = writer.Write(outBlock)
if err != nil {
return fmt.Errorf("unable to write: %v", err)
}
}
}