def spbox(idx,reg, t0, t1): x = reg[idx] y = reg[idx+1] z = reg[idx+2] AVR.comment('START SPBOX') AVR.comment('rotate x by 16: no register renaming') AVR.PUSH(x[0]) AVR.MOV(x[0],x[3]) AVR.MOV(x[3],x[2]) AVR.MOV(x[2],x[1]) AVR.POP(x[1]) # 24 + 2 = 26 AVR.comment('rotate y by 9 : 1 + register renaming') AVR.CLR0(t0) AVR.ROL32(y,t0) AVR.PUSH(y[0]) AVR.MOV(y[0],y[1]) AVR.MOV(y[1],y[2]) AVR.MOV(y[2],y[3]) AVR.POP(y[3]) AVR.comment('compute x') AVR.MOVW32(t1,x) AVR.MOVW32(t0,z) AVR.LSL32(t0) AVR.MOVW32(x,y) AVR.AND32(x,z) AVR.LSL32(x) AVR.LSL32(x) AVR.EOR32(x,t0) AVR.EOR32(x,t1) AVR.comment('compute y') AVR.MOVW32(t0,y) AVR.MOVW32(y,t1) AVR.OR32(y,z) AVR.LSL32(y) AVR.EOR32(y,t1) AVR.EOR32(y,t0) AVR.comment('compute z') AVR.AND32(t1,t0) AVR.LSL32(t1) AVR.LSL32(t1) AVR.LSL32(t1) AVR.EOR32(t0,t1) AVR.EOR32(z,t0) AVR.comment('swap x and z') AVR.PUSH32(z) AVR.MOV(z[0],x[0]) AVR.MOV(z[1],x[1]) AVR.MOV(z[2],x[2]) AVR.MOV(z[3],x[3]) AVR.POP32(x) return reg
def spbox(idx, reg, t0, t1): x = reg[idx] y = reg[idx + 1] z = reg[idx + 2] AVR.comment('START SPBOX') AVR.comment('rotate x by 16: register renaming') # AVR.CLR0(t0) # AVR.ROL32(x,t0) # AVR.ROL32(x,t0) AVR.rotate8(x) # rotate by 8 AVR.rotate8(x) # rotate by 8 AVR.rotate8(x) # rotate by 8 # 24 + 2 = 26 AVR.comment('rotate y by 9 : 1 + register renaming') AVR.CLR0(t0) AVR.ROL32(y, t0) AVR.rotate8(y) # rotate by 8 # 8 + 1 = 9 AVR.comment('compute x') AVR.MOVW32(t1, x) AVR.MOVW32(t0, z) AVR.LSL32(t0) AVR.MOVW32(x, y) AVR.AND32(x, z) AVR.LSL32(x) AVR.LSL32(x) AVR.EOR32(x, t0) AVR.EOR32(x, t1) AVR.comment('compute y') AVR.MOVW32(t0, y) AVR.MOVW32(y, t1) AVR.OR32(y, z) AVR.LSL32(y) AVR.EOR32(y, t1) AVR.EOR32(y, t0) AVR.comment('compute z') AVR.AND32(t1, t0) AVR.LSL32(t1) AVR.LSL32(t1) AVR.LSL32(t1) AVR.EOR32(t0, t1) AVR.EOR32(z, t0) reg[idx], reg[idx + 2] = reg[idx + 2], reg[idx] AVR.comment('END SPBOX') return reg