示例#1
0
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
示例#2
0
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
示例#3
0
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