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
AVR.LBL('jspbxend') AVR.JMP('spbxend') AVR.LBL('hopspx') AVR.PUSH(28) load() AVR.PUSHZ() AVR.JMP('spbox') AVR.LBL('spboxend') AVR.POPZ() store() AVR.ADIW(30,8) AVR.POP(28) AVR.DEC(28) AVR.JMP('spbx') AVR.LBL('spbxend') AVR.SBIW(30,16) # pop the constant of the round AVR.POP(28) AVR.LDI(27,3) AVR.AND(27,28) AVR.CPI(27,0) AVR.BRNE('bigswap')