def stack_load_left_to_right(reg): AVR.POPZ() # idx + 48 AVR.PUSH32(reg[3]) AVR.PUSH32(reg[0]) # DO WE DO ONLY A SIMPLE REINIT OR A FULL ??? reg[0].sort() # we only re init the values in r[0] and r[3] reg[3].sort() # we only re init the values in r[0] and r[3] AVR.SBIW(30, 48) # go the begining of the state AVR.LDZ32(reg[0]) # load r[0] AVR.LDZ32(reg[3]) # load r[3] AVR.ADIW(30, 40) # go back to idx+48 : 4 + 4 + 16 + 16 AVR.PUSHZ() # push to the stack : idx + 48 return reg
def stack_load_right_to_left(reg): AVR.POPZ() # idx + 40 AVR.PUSH32(reg[3]) AVR.PUSH32(reg[0]) reg[3].sort() reg[0].sort() # reg = reinit_state(reg) # we only re init the values in r[0] and r[3] AVR.SBIW(30, 32) # skip the next two words AVR.LDZ32(reg[0]) # load r[0] AVR.LDZ32(reg[3]) # load r[3] AVR.ADIW(30, 24) # skip back 8 + 16 # current value of idx is +40 AVR.PUSHZ() 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: 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