// generateBarriers creates the encoding barriers between rounds that compute ShiftRows and re-encodes data. func generateBarriers(rs *random.Source, out *Construction, inputMask, outputMask, sr *matrix.Matrix) { // Generate the ShiftRows and re-encoding matrices. out.ShiftRows[0] = maskSwap(rs, 16, 0).Compose(*sr).Compose(*inputMask) for round := 1; round < 10; round++ { out.ShiftRows[round] = maskSwap(rs, 16, round).Compose(*sr).Compose(maskSwap(rs, 32, round-1)) } // We need to apply a final matrix transformation to convert the double-level encoding to a block-level one. out.FinalMask = outputMask.Compose(maskSwap(rs, 32, 9)) }
// SubByte is AES' S-box. It is a bijection. func (constr *Construction) SubByte(e byte) byte { // AES S-Box m := matrix.Matrix{ // Linear component. matrix.Row{0xF1}, // 0b11110001 matrix.Row{0xE3}, // 0b11100011 matrix.Row{0xC7}, // 0b11000111 matrix.Row{0x8F}, // 0b10001111 matrix.Row{0x1F}, // 0b00011111 matrix.Row{0x3E}, // 0b00111110 matrix.Row{0x7C}, // 0b01111100 matrix.Row{0xF8}, // 0b11111000 } a := byte(0x63) // 0b01100011 - Affine component. return m.Mul(matrix.Row{byte(number.ByteFieldElem(e).Invert())})[0] ^ a }
// FindPermutation is called on the first affine layer. It returns the permutation matrix corresponding to the row // permutation that has occured to the first layer. func (al *affineLayer) findPermutation() matrix.Matrix { permed := (*al).BlockLinear.Forwards unpermed := matrix.Matrix{} for i := 0; i < 8; i++ { for pos := 0; pos < 16; pos++ { if h := permed[8*pos].Height(); 16*i <= h && h < 16*(i+1) { unpermed = append(unpermed, permed[8*pos:8*(pos+1)]...) } } } unpermed, _ = unpermed.Invert() perm := permed.Compose(unpermed) return perm }
// UnSubByte is the inverse of SubByte. It is a bijection. func (constr *Construction) UnSubByte(e byte) byte { // AES Inverse S-Box m := matrix.Matrix{ matrix.Row{0xA4}, matrix.Row{0x49}, matrix.Row{0x92}, matrix.Row{0x25}, matrix.Row{0x4a}, matrix.Row{0x94}, matrix.Row{0x29}, matrix.Row{0x52}, } a := byte(0x63) invVal := m.Mul(matrix.Row{e ^ a})[0] return byte(number.ByteFieldElem(invVal).Invert()) }
// findMatrix finds an invertible matrix in a basis. func findMatrix(basis []matrix.Row) matrix.Matrix { im := matrix.NewIncrementalMatrix(64) for _, row := range basis { im.Add(row) } size := im.Size() for i := 0; i < size; i++ { row := im.Row(i) cand := matrix.Matrix{} for _, v := range row { cand = append(cand, matrix.Row{v}) } if _, ok := cand.Invert(); ok { return cand } } panic("Couldn't find an invertible matrix in the given basis!") }
var round = matrix.Matrix{ matrix.Row{0xf8, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1}, matrix.Row{0x09, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xe3}, matrix.Row{0xe3, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xc7}, matrix.Row{0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x8f}, matrix.Row{0x77, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f}, matrix.Row{0x1f, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e}, matrix.Row{0x3e, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c}, matrix.Row{0x7c, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf8}, matrix.Row{0xf1, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xf1}, matrix.Row{0xe3, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0xe3}, matrix.Row{0xc7, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xc7}, matrix.Row{0x8f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x8f}, matrix.Row{0x1f, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1f}, matrix.Row{0x3e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x3e}, matrix.Row{0x7c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x7c}, matrix.Row{0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf8}, matrix.Row{0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x09}, matrix.Row{0xe3, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xea}, matrix.Row{0xc7, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x24}, matrix.Row{0x8f, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0}, matrix.Row{0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x68}, matrix.Row{0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x21}, matrix.Row{0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x42}, matrix.Row{0xf8, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x84}, matrix.Row{0x09, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf8}, matrix.Row{0xea, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x09}, matrix.Row{0x24, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xe3}, matrix.Row{0xb0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x3f}, matrix.Row{0x68, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x77}, matrix.Row{0x21, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1f}, matrix.Row{0x42, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3e}, matrix.Row{0x84, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c}, matrix.Row{0x00, 0x00, 0x00, 0xf1, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xe3, 0x09, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xc7, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x8f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x1f, 0x77, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xf8, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xf1, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xe3, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xc7, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x09, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xea, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x24, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xb0, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x68, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x21, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x84, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xf8, 0x09, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x09, 0xea, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x3f, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x77, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x1f, 0x21, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x3e, 0x42, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00}, matrix.Row{0x00, 0x00, 0x00, 0x7c, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00}, matrix.Row{0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x09, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x77, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x09, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xea, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x24, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x68, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x21, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x84, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x09, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x09, 0xea, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x77, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x21, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00}, matrix.Row{0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00}, matrix.Row{0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf8, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x09, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xe3, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x3f, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x77, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x7c, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf1, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xe3, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xc7, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x09, 0xf1, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0xea, 0xe3, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x24, 0xc7, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x8f, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x68, 0x1f, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x21, 0x3e, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x42, 0x7c, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x84, 0xf8, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x09, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x09, 0xea, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x24, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xb0, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x77, 0x68, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x21, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x00, 0x00, 0x00}, matrix.Row{0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x84, 0x00, 0x00, 0x00}, }