The ^ denotes a XOR operation, while * denotes the multiplication in a finite field (GF(256)). Essentially, this multiplication is such that the result of multiplying two bytes together will produce a byte, without overflowing. For example, 2*127 = 254 and 2*128 = 27. For further references, arithmetic in the finite field GF(256) is detailed here. In order to perform those multiplications, it is possible to implement a generic gmul(x,y) for every x and y. However, we know that we only need to multiply by 2 and 3 so we can build two lookup tables for those values. Actually, those tables can be found here.