Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2020
2,218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.45 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "encoding/binary"
  5.     "fmt"
  6.     "strconv"
  7. )
  8.  
  9. func crc32v(idx int) int {
  10.     POLY := 0x04c11db7
  11.     c := idx << 24 & 0xFFFFFFFF
  12.     for i := 0; i < 8; i++ {
  13.         if c&0x80000000 > 0 {
  14.             c = c<<1 ^ POLY
  15.         } else {
  16.             c = c << 1 & 0xFFFFFFFF
  17.         }
  18.     }
  19.     return c
  20. }
  21.  
  22. func adler32(bs []byte) int {
  23.     s1 := 4
  24.     s2 := 0
  25.     for _, x := range bs {
  26.         s1 = (s1 + int(x)) % 65521
  27.         s2 = (s2 + s1) % 65521
  28.     }
  29.     res := (s2 << 16) | s1
  30.     return res
  31. }
  32.  
  33. func prepareSubs(key []int) [][]int {
  34.     table1 := make([]int, 256)
  35.     for i := range table1 {
  36.         table1[i] = i
  37.     }
  38.     s := 0
  39.     for i := range table1 {
  40.         s += table1[i]
  41.         s += key[i%len(key)]
  42.         s &= 0xFF
  43.         table1[i] = table1[s]
  44.     }
  45.  
  46.     table2 := make([]int, 256)
  47.     for i, v := range table1 {
  48.         table2[i] = v
  49.     }
  50.     s = 0
  51.     for i := range table2 {
  52.         if i > 0 {
  53.             s = (table2[i] + s) & 0xFF
  54.             table2[i] = table2[s]
  55.         }
  56.     }
  57.     out := [][]int{table1, table2}
  58.     return out
  59. }
  60.  
  61. // Reverse a string
  62. func Reverse(s string) (result string) {
  63.     for _, v := range s {
  64.         result = string(v) + result
  65.     }
  66.     return
  67. }
  68.  
  69. // Takes an int and width, converts to base 2,
  70. // then left pads it with a total of (width - len(base2_result)) zeros.
  71. // as a string, then reverses it and converts it back to an integer.
  72. // The resulting int is then assigned to "x" in the main Leviathan function
  73. // and has some bitwise operations performed on it.
  74. func rbit(x int, width int) int {
  75.     x2 := strconv.FormatInt(int64(x), 2)
  76.     orig := len(x2)
  77.     for i := 0; i < width-orig; i++ {
  78.         x2 = fmt.Sprintf("0%s", x2)
  79.     }
  80.     x3, _ := strconv.ParseInt(Reverse(x2), 2, 32)
  81.     return int(x3)
  82. }
  83.  
  84. // Leviathan
  85. func Leviathan(srcData []byte, timestamp uint64) string {
  86.     ldsBytes := []byte{0x0D, 0xC0, 0xA0, 0xE1, 0xF0, 0x00, 0x2D, 0xE9, 0xE9, 0x00, 0x40, 0xE2, 0x00, 0x70, 0xA0, 0xE1, 0x01, 0x00, 0xA0, 0xE1, 0x02, 0x10, 0xA0, 0xE1, 0x03, 0x20, 0xA0, 0xE1, 0x78, 0x00, 0x9C, 0xE8}
  87.     stackCrc := crc32v(0x63)
  88.     inpbs := []byte{}
  89.     for i := 0; i < 4; i++ {
  90.         next := srcData[i*16 : i*16+4]
  91.         for _, b := range next {
  92.             inpbs = append(inpbs, b)
  93.         }
  94.     }
  95.  
  96.     // Append timestamp bytes to inpbs
  97.     tsBytes := make([]byte, 4)
  98.     binary.BigEndian.PutUint32(tsBytes, uint32(timestamp))
  99.     for _, b := range tsBytes {
  100.         inpbs = append(inpbs, b)
  101.     }
  102.     ldsChecksum := adler32(ldsBytes)
  103.     crcbs := 0
  104.     for i := 0; i < 4; i++ {
  105.         crcbs = (crcbs << 4) + (ldsChecksum & 0xff)
  106.         ldsChecksum >>= 8
  107.     }
  108.     crcbs = (crc32v(crcbs&0xFF) ^ crc32v((crcbs>>8)&0xFF))
  109.     key := []int{
  110.         crcbs & 0xFF,
  111.         0,
  112.         (crcbs >> 8) & 0xFF,
  113.         (stackCrc >> 8) & 0xFF,
  114.         (crcbs >> 16) & 0xFF,
  115.         (crcbs >> 24) & 0xFF,
  116.         0,
  117.         stackCrc & 0xFF,
  118.     }
  119.  
  120.     // Returns multi-dimensional int array
  121.     sbox := prepareSubs(key)
  122.     result := make([]int, len(inpbs)) // It prepends like 6 bytes before the return
  123.  
  124.     for r, i := range inpbs {
  125.         result[r] = int(i)
  126.     }
  127.  
  128.     for i := range result {
  129.         result[i] ^= sbox[0][(sbox[1][i+1]<<1)&0xFF]
  130.     }
  131.  
  132.     for i := range result {
  133.         x := ((result[i] << 4) & 0xF0) | ((result[i] >> 4) & 0xF)
  134.         x ^= result[(i+1)%len(result)]
  135.         x = rbit(x, 8)
  136.         x ^= 0xFF
  137.         x ^= 0x14
  138.         result[i] = x
  139.     }
  140.  
  141.     pre := make([]int, len(result)+6)
  142.     pre[0] = 0x03
  143.     pre[1] = 0x6F
  144.     pre[2] = key[7]
  145.     pre[3] = key[3]
  146.     pre[4] = 0
  147.     pre[5] = 0
  148.  
  149.     for r, v := range result {
  150.         pre[r+6] = v
  151.     }
  152.  
  153.     str := ""
  154.     for _, p := range pre {
  155.         str = fmt.Sprintf("%s%02x", str, p)
  156.     }
  157.  
  158.     fmt.Println("As []int: \t", pre)
  159.     fmt.Printf("As hex:\t\t%02x\n", pre)
  160.     fmt.Printf("As hex string:\t%v\n", str)
  161.     return str
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement