def store_load_right_to_left(reg): AVR.POPZ() # idx + 48 AVR.STZ32(reg[5]) # store z AVR.STZ32(reg[2]) # store y AVR.SBIW(30, 8) AVR.STZ32(reg[4]) # store x AVR.STZ32(reg[1]) # store z AVR.SBIW(30, 8) AVR.STZ32(reg[3]) # store y AVR.STZ32(reg[0]) # store x reg = init_state() # reinit the state. # current idx is +8 AVR.ADIW(30, 8) # go to idx + 16 AVR.LDZ32(reg[1]) # load r[1] AVR.LDZ32(reg[4]) # load r[2] AVR.ADIW(30, 8) # skip the next 4 words as they contain garbage (former r[3]) AVR.LDZ32(reg[2]) # load r[4] AVR.LDZ32(reg[5]) # load r[5] # pop the initial values of the other half from the stack ! :p AVR.POP32(reg[0]) # load r[0] AVR.POP32(reg[3]) # load r[1] # 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