def mix(column): fixedmatrix = bytearray([0x02, 0x03, 0x01, 0x01]) mixcolumnmatrix = bytearray() for i in range(4): resultinglist = [] rijndael = gf.makeblist(0x11b) for j in range(4): fixedbytelist = gf.makeblist(fixedmatrix[j]) columnvector = gf.makeblist(column[j]) resultingbyte = gf.mul(fixedbytelist, columnvector) if gf.value(resultingbyte) > 255: resultingbyte = gf.div(resultingbyte, rijndael)[1] resultinglist.append(resultingbyte) finalvalue = gf.add(resultinglist[0], resultinglist[1]) finalvalue = gf.add(finalvalue, resultinglist[2]) finalvalue = gf.add(finalvalue, resultinglist[3]) mixcolumnmatrix.append(gf.value(finalvalue)) fixedmatrix = gf.circrotateright(fixedmatrix) return mixcolumnmatrix
def inv(column): fixedmatrix = bytearray([0x0e, 0x0b, 0x0d, 0x09]) mixcolumnmatrix = bytearray() for i in range(0, 4): resultinglist = [] rijndael = gf.makeblist(0x11b) for j in range(0, 4): fixedbitlist = gf.makeblist(fixedmatrix[j]) columnvector = gf.makeblist(column[j]) resultingbyte = gf.mul(fixedbitlist, columnvector) while gf.value(resultingbyte) > 255: # note the inverted division function! resultingbyte = gf.div(rijndael, resultingbyte)[1] resultinglist.append(resultingbyte) finalvalue = gf.add(resultinglist[0], resultinglist[1]) finalvalue = gf.add(finalvalue, resultinglist[2]) finalvalue = gf.add(finalvalue, resultinglist[3]) mixcolumnmatrix.append(gf.value(finalvalue)) fixedmatrix = gf.circrotateright(fixedmatrix) return mixcolumnmatrix
def makematrix(): matrixbits = [0, 0, 0, 1, 1, 1, 1, 1] # 0x1F affmatrix = [] for i in range(8): matrixbits = gf.circrotateright(matrixbits) affmatrix.append(matrixbits) return affmatrix
def makeinversematrix(): matrixbits = [0, 1, 0, 0, 1, 0, 1, 0] # inverse of 0x1F (in GF?) affmatrix = [] for i in range(8): matrixbits = gf.circrotateright(matrixbits) affmatrix.append(matrixbits) return affmatrix
def do(state): r0, r1, r2, r3 = bytearray(), bytearray(), bytearray(), bytearray() for i in range(4): r0.append(state[i * 4]) r1.append(state[1 + i * 4]) r2.append(state[2 + i * 4]) r3.append(state[3 + i * 4]) r1 = gf.circrotateleft(r1) r2 = gf.circrotateleft(gf.circrotateleft(r2)) r3 = gf.circrotateright(r3) newstatematrix = r0 + r1 + r2 + r3 return newstatematrix