package ximalaya import ( _ "embed" "encoding/binary" ) var x3mKey = [...]byte{ '3', '9', '8', '9', 'd', '1', '1', '1', 'a', 'a', 'd', '5', '6', '1', '3', '9', '4', '0', 'f', '4', 'f', 'c', '4', '4', 'b', '6', '3', '9', 'b', '2', '9', '2', } const x3mHeaderSize = 1024 var x3mScrambleTable = [x3mHeaderSize]uint16{} //go:embed x3m_scramble_table.bin var x3mScrambleTableBytes []byte func init() { if len(x3mScrambleTableBytes) != 2*x3mHeaderSize { panic("invalid x3m scramble table") } for i := range x3mScrambleTable { x3mScrambleTable[i] = binary.LittleEndian.Uint16(x3mScrambleTableBytes[i*2:]) } } // decryptX3MHeader decrypts the header of ximalaya .x3m file. // make sure input src is 1024 (x3mHeaderSize) bytes long. func decryptX3MHeader(src []byte) []byte { dst := make([]byte, len(src)) for dstIdx := range src { srcIdx := x3mScrambleTable[dstIdx] dst[dstIdx] = src[srcIdx] ^ x3mKey[dstIdx%len(x3mKey)] } return dst }