Example #1
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
Example #2
0
AVR.comment(' X,Y,Z: Indirect Address Register (X=R27:R26, Y=R29:R28, and Z=R31:R30)')
AVR.push_to_stack()
AVR.comment('START CYCLE COUNT')

AVR.MOVW(30,24)								# load operand address state to Z

AVR.LDI(28,24)
AVR.LBL('roundf')
AVR.CPI(28,0)
AVR.BREQ('jroundfend')
AVR.JMP('hop')
AVR.LBL('jroundfend')
AVR.JMP('end')
AVR.LBL('hop')
AVR.PUSH(28)

# apply the SBox

AVR.LBL('spboxes')
AVR.LDI(28,2)

AVR.LBL('spbx')
AVR.CPI(28,0)
AVR.BREQ('jspbxend')

AVR.JMP('hopspx')
AVR.LBL('jspbxend')
AVR.JMP('spbxend')
AVR.LBL('hopspx')
AVR.PUSH(28)