package main

import (
	"fmt"
	"os"
)

func parity(b uint8) uint8 {
	b ^= (b >> 4)
	b ^= (b >> 2)
	b ^= (b >> 1)
	return (b & 1)
}

func convolve(sequence []uint8, G0, G1 uint8) []uint8 {
	res := make([]uint8, 0)
	var state uint8 = 0
	for _, bit := range sequence {
		state = (state << 1) | bit
		res = append(res, parity(state&G0))
		res = append(res, parity(state&G1))
	}

	for range 4 {
		state = (state << 1)
		res = append(res, parity(state&G0))
		res = append(res, parity(state&G1))
	}

	return res
}

func convertAsBits(sequence []uint8) []uint8 {
	res := make([]uint8, 0)
	for _, b := range sequence {
		for i := range 8 {
			bit := (b >> (7 - i)) & 1
			res = append(res, uint8(bit))
		}
	}
	return res
}

func main() {
	flag, _ := os.ReadFile("flag.txt")
	bitSequence := convertAsBits(flag)

	var G0 uint8 = 0x19 // X**4 + X**3 + 1
	var G1 uint8 = 0x1B // X**4 + X**3 + X +1
	result := convolve(bitSequence, G0, G1)

	fmt.Printf("Encoded flag: ")
	for _, b := range result {
		fmt.Printf("%d", b)
	}
	fmt.Printf("\n")
	// Encoded flag: 00110100110010011111100011111110010001001011000101000111111111100100100101011110100001001011000101000111111111100111110101000111110010101000111000001011011011111011100001010110011101001011111100001110011100110011100100101011000010100101001110111011000110100011010100100101011101110001010001001000101100010100010001010110011101111111110100000110101101001000100010001011110001110101011001110111111111100111110101110011001110010010011000111011100001101111100000011001011110100010101100001010101101001000100010001011111111100111000001000001011100110011100100100110001101011100111101110110001010110000011101010110011101111111111001000111000110010111011111000100111111100111110101111101010001001000100001010110010011010100011111001010100011100000100011000111100010000101011001110111000110100000001001110011001110101011011111000111010101100111010010001011110010010001111111001110010001111100011110001011110001110101011001110111001000111100111001000111110010101000111000001000110001001100101001100111011111111101111011111100
}
