plonky2/evm/src/cpu/kernel/asm/ripemd/compression.asm

264 lines
8.0 KiB
NASM
Raw Normal View History

2022-09-19 18:11:07 -07:00
/// _block is stored in memory and its address virt remains on the stack
/// Note that STATE takes up 5 stack slots
/// def compress(state, _block):
2022-08-23 12:03:06 -07:00
///
/// stateL = state
/// stateL = loop(stateL)
///
/// stateR = state
/// stateR = loop(stateR)
///
2022-08-25 15:38:18 -07:00
/// return mix(state, stateL, stateR)
///
///
2022-09-19 18:11:07 -07:00
/// def mix(stateR, stateL, state):
2022-08-25 15:38:18 -07:00
/// return
2022-09-13 14:32:41 -07:00
/// u32(s1 + l2 + r3),
/// u32(s2 + l3 + r4),
/// u32(s3 + l4 + r0),
/// u32(s4 + l0 + r1),
/// u32(s0 + l1 + r2)
2022-08-25 15:38:18 -07:00
///
2022-09-27 22:17:48 -07:00
/// where si, li, ri, oi, VR, RD respectively denote
2022-09-19 18:11:07 -07:00
/// state[i], stateL[i], stateR[i], output[i], virt, retdest
2022-08-23 12:03:06 -07:00
2022-09-19 18:11:07 -07:00
global compress:
2022-09-23 00:15:44 -07:00
// stack: STATE, virt, retdest
2022-09-22 23:19:21 -07:00
PUSH switch
DUP7
2022-09-23 12:13:18 -07:00
%stack () -> (0, 0, 16, 5, 1)
2022-09-22 23:19:21 -07:00
// stack: 0, 0, 16, 5, 1, virt, switch, STATE, virt, retdest
DUP12
DUP12
DUP12
DUP12
DUP12
// stack: STATE, 0, 0, 16, 5, 1, virt, switch, STATE, virt, retdest
2022-08-23 12:03:06 -07:00
%jump(loop)
switch:
2022-09-22 23:19:21 -07:00
// stack: STATEL, STATE, virt, retdest
PUSH mix
DUP12
2022-09-27 22:17:48 -07:00
%stack () -> (16, 5, 0)
2022-09-22 23:19:21 -07:00
// stack: 16, 5, 0, virt, mix, STATEL, STATE, virt, retdest
DUP15
DUP15
DUP15
DUP15
DUP15
// stack: STATE, 16, 5, 0, virt, mix, STATEL, STATE, virt, retdest
%stack (STATE: 5) -> (STATE, 0, 0)
// stack: STATE, 0, 0, 16, 5, 0, virt, mix, STATEL, STATE, virt, retdest
2022-08-23 12:03:06 -07:00
%jump(loop)
mix:
2022-09-19 18:11:07 -07:00
// stack: r0, r1, r2, r3, r4, l0, l1, l2, l3, l4, s0, s1, s2, s3, s4, VR, RD
2022-09-09 17:38:36 -07:00
SWAP10
2022-09-19 18:11:07 -07:00
// stack: s0, r1, r2, r3, r4, l0, l1, l2, l3, l4, r0, s1, s2, s3, s4, VR, RD
2022-09-09 17:38:36 -07:00
SWAP1
2022-09-19 18:11:07 -07:00
// stack: r1, s0, r2, r3, r4, l0, l1, l2, l3, l4, r0, s1, s2, s3, s4, VR, RD
2022-09-09 17:38:36 -07:00
SWAP6
2022-09-19 18:11:07 -07:00
// stack: l1, s0, r2, r3, r4, l0, r1, l2, l3, l4, r0, s1, s2, s3, s4, VR, RD
2022-09-21 20:03:11 -07:00
%add3_u32
2022-09-19 18:11:07 -07:00
// stack: o4, r3, r4, l0, r1, l2, l3, l4, r0, s1, s2, s3, s4, VR, RD
2022-09-13 14:32:41 -07:00
SWAP14
2022-09-19 18:11:07 -07:00
// stack: RD, r3, r4, l0, r1, l2, l3, l4, r0, s1, s2, s3, s4, VR, o4
2022-09-09 17:38:36 -07:00
SWAP11
2022-09-19 18:11:07 -07:00
// stack: s3, r3, r4, l0, r1, l2, l3, l4, r0, s1, s2, RD, s4, VR, o4
2022-09-09 17:38:36 -07:00
SWAP10
2022-09-19 18:11:07 -07:00
// stack: s2, r3, r4, l0, r1, l2, l3, l4, r0, s1, s3, RD, s4, VR, o4
2022-09-09 17:38:36 -07:00
SWAP1
2022-09-19 18:11:07 -07:00
// stack: r3, s2, r4, l0, r1, l2, l3, l4, r0, s1, s3, RD, s4, VR, o4
2022-09-09 17:38:36 -07:00
SWAP6
2022-09-19 18:11:07 -07:00
// stack: l3, s2, r4, l0, r1, l2, r3, l4, r0, s1, s3, RD, s4, VR, o4
2022-09-21 20:03:11 -07:00
%add3_u32
2022-09-19 18:11:07 -07:00
// stack: o1, l0, r1, l2, r3, l4, r0, s1, s3, RD, s4, VR, o4
2022-09-13 14:32:41 -07:00
SWAP9
2022-09-19 18:11:07 -07:00
// stack: RD, l0, r1, l2, r3, l4, r0, s1, s3, o1, s4, VR, o4
2022-09-09 17:38:36 -07:00
SWAP10
2022-09-19 18:11:07 -07:00
// stack: s4, l0, r1, l2, r3, l4, r0, s1, s3, o1, RD, VR, o4
2022-09-21 20:03:11 -07:00
%add3_u32
2022-09-19 18:11:07 -07:00
// stack: o3, l2, r3, l4, r0, s1, s3, o1, RD, VR, o4
2022-09-13 14:32:41 -07:00
SWAP9
2022-09-19 18:11:07 -07:00
// stack: VR, l2, r3, l4, r0, s1, s3, o1, RD, o3, o4
2022-09-09 17:38:36 -07:00
SWAP5
2022-09-19 18:11:07 -07:00
// stack: s1, l2, r3, l4, r0, VR, s3, o1, RD, o3, o4
2022-09-21 20:03:11 -07:00
%add3_u32
2022-09-19 18:11:07 -07:00
// stack: o0, l4, r0, VR, s3, o1, RD, o3, o4
2022-09-13 14:32:41 -07:00
SWAP4
2022-09-19 18:11:07 -07:00
// stack: s3, l4, r0, VR, o0, o1, RD, o3, o4
2022-09-21 20:03:11 -07:00
%add3_u32
2022-09-19 18:11:07 -07:00
// stack: o2, VR, o0, o1, RD, o3, o4
2022-09-13 14:32:41 -07:00
SWAP4
2022-09-19 18:11:07 -07:00
// stack: RD, VR, o0, o1, o2, o3, o4
2022-09-13 14:32:41 -07:00
SWAP1
2022-09-19 18:11:07 -07:00
// stack: VR, RD, o0, o1, o2, o3, o4
2022-09-13 14:32:41 -07:00
POP
2022-09-23 10:39:49 -07:00
// stack: RD, o0, o1, o2, o3, o4
2022-09-09 17:38:36 -07:00
JUMP
2022-08-25 15:38:18 -07:00
2022-09-19 18:11:07 -07:00
/// def loop(STATE):
2022-08-25 15:38:18 -07:00
/// while rounds:
/// update_round_vars()
2022-09-19 18:11:07 -07:00
/// round(STATE, F, K, rounds, sides)
2022-08-25 15:38:18 -07:00
///
/// def update_round_vars():
2022-09-16 19:18:26 -07:00
/// F = load(F)(sides, rounds)
/// K = load(K)(sides, rounds)
2022-08-25 15:38:18 -07:00
///
2022-09-19 18:11:07 -07:00
/// def round(STATE, rounds, sides):
2022-08-25 15:38:18 -07:00
/// while boxes:
2022-09-19 18:11:07 -07:00
/// box(STATE, F, K)
2022-08-25 15:38:18 -07:00
/// boxes -= 1
/// boxes = 16
/// rounds -= 1
2022-09-16 19:18:26 -07:00
loop:
2022-09-19 18:11:07 -07:00
// stack: STATE, F, K, 16, rounds, sides, virt, retdest
2022-09-09 17:38:36 -07:00
DUP9
2022-09-19 18:11:07 -07:00
// stack: round, STATE, F, K, 16, rounds, sides, virt, retdest
2022-08-25 15:38:18 -07:00
%jumpi(update_round_vars)
2022-09-19 18:11:07 -07:00
// stack: STATE, F, K, 16, 0, sides, virt, retdest
2022-09-21 13:42:13 -07:00
%stack (STATE: 5, F, K, boxes, rounds, sides, virt, retdest) -> (retdest, STATE)
2022-09-19 18:11:07 -07:00
// stack: retdest, STATE
2022-09-09 17:38:36 -07:00
JUMP
2022-08-25 15:38:18 -07:00
update_round_vars:
2022-09-19 18:11:07 -07:00
// stack: STATE, F , K , 16, rounds, sides, virt, retdest
2022-09-09 17:38:36 -07:00
DUP9
DUP11
%get_round
DUP1
2022-09-19 18:11:07 -07:00
// stack: rnd, rnd, STATE, F , K , 16, rounds, sides, virt, retdest
2022-09-09 17:38:36 -07:00
SWAP7
POP
2022-09-21 20:06:41 -07:00
%push_f
2022-09-09 17:38:36 -07:00
SWAP7
2022-09-19 18:11:07 -07:00
// stack: rnd, rnd, STATE, F', K , 16, rounds, sides, virt, retdest
2022-09-09 17:38:36 -07:00
SWAP8
POP
2022-09-22 09:40:40 -07:00
%mul_const(4)
2022-09-28 00:00:58 -07:00
%mload_kernel_code_label_u32(k_data)
2022-09-09 17:38:36 -07:00
SWAP7
POP
2022-09-19 18:11:07 -07:00
// stack: STATE, F', K', 16, rounds, sides, virt, retdest
2022-08-25 15:38:18 -07:00
%jump(round)
round:
2022-09-19 18:11:07 -07:00
// stack: STATE, F, K, boxes, rounds , sides, virt, retdest
2022-09-09 17:38:36 -07:00
DUP8
2022-09-19 18:11:07 -07:00
// stack: boxes, STATE, F, K, boxes, rounds , sides, virt, retdest
2022-08-25 15:38:18 -07:00
%jumpi(box)
2022-09-19 18:11:07 -07:00
// stack: STATE, F, K, 0, rounds , sides, virt, retdest
2022-09-09 17:38:36 -07:00
SWAP7
POP
PUSH 16
SWAP7
2022-09-19 18:11:07 -07:00
// stack: STATE, F, K, 16, rounds , sides, virt, retdest
2022-09-09 17:38:36 -07:00
PUSH 1
DUP10
SUB
SWAP9
POP
2022-09-19 18:11:07 -07:00
// stack: STATE, F, K, 16, rounds-1, sides, virt, retdest
2022-08-25 15:38:18 -07:00
%jump(loop)
2022-09-19 18:11:07 -07:00
/// Note that we unpack STATE to a, b, c, d, e
2022-08-25 15:38:18 -07:00
/// All additions are u32
///
/// def box(a, b, c, d, e, F, K):
///
2022-08-25 16:18:45 -07:00
/// box = get_box(sides, rounds, boxes)
2022-08-25 15:38:18 -07:00
/// a += F(b, c, d)
2022-09-21 20:03:11 -07:00
/// r = load(r)(box)
2022-09-19 12:09:57 -07:00
/// x = load_offset(r)
2022-08-25 15:38:18 -07:00
/// a += x + K
2022-09-21 20:03:11 -07:00
/// s = load(s)(box)
2022-09-08 19:35:37 -07:00
/// a = rol(s, a)
2022-08-25 15:38:18 -07:00
/// a += e
2022-09-08 19:35:37 -07:00
/// c = rol(10, c)
2022-08-25 15:38:18 -07:00
///
/// return e, a, b, c, d, F, K
box:
2022-09-19 18:11:07 -07:00
// stack: a, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-09 17:38:36 -07:00
PUSH pre_rol
DUP5
DUP5
DUP5
DUP10
2022-09-19 18:11:07 -07:00
// stack: F, b, c, d, pre_rol, a, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-09 17:38:36 -07:00
JUMP
2022-08-25 15:38:18 -07:00
pre_rol:
2022-09-22 10:34:32 -07:00
// stack: F(b, c, d), a, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-09 17:38:36 -07:00
ADD
2022-09-22 10:34:32 -07:00
// stack: a, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-16 19:18:26 -07:00
%get_box
2022-09-22 10:34:32 -07:00
// stack: box, a, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-23 00:15:44 -07:00
DUP12
DUP2
2022-09-28 00:00:58 -07:00
%mload_kernel_code_label(r_data)
2022-09-19 12:09:57 -07:00
ADD
2022-09-23 00:15:44 -07:00
// stack: virt + r, box, a, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-23 08:05:14 -07:00
%load_u32_from_block
2022-09-22 10:34:32 -07:00
// stack: x, box, a, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-09 17:38:36 -07:00
SWAP1
SWAP2
2022-09-22 10:34:32 -07:00
// stack: a, x, box, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-09 17:38:36 -07:00
ADD
DUP8
ADD
%u32
2022-09-22 10:34:32 -07:00
// stack: a, box, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-09 17:38:36 -07:00
PUSH mid_rol
SWAP2
2022-09-22 10:34:32 -07:00
// stack: box, a, mid_rol, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-28 00:00:58 -07:00
%mload_kernel_code_label(s_data)
2022-09-22 10:34:32 -07:00
// stack: s, a, mid_rol, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-08 19:35:37 -07:00
%jump(rol)
2022-08-25 15:38:18 -07:00
mid_rol:
2022-09-19 18:11:07 -07:00
// stack: a, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-09 17:38:36 -07:00
DUP5
2022-09-19 18:11:07 -07:00
// stack: e, a, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-09 17:38:36 -07:00
ADD
%u32
2022-09-19 18:11:07 -07:00
// stack: a, b, c, d, e, F, K, boxes, rounds, sides, virt
2022-09-09 17:38:36 -07:00
SWAP1
SWAP2
PUSH post_rol
SWAP1
PUSH 10
2022-09-19 18:11:07 -07:00
// stack: 10, c, post_rol, b, a, d, e, F, K, boxes, rounds, sides, virt
2022-09-08 19:35:37 -07:00
%jump(rol)
2022-08-25 15:38:18 -07:00
post_rol:
2022-09-19 18:11:07 -07:00
// stack: c, a, b, d, e, F, K, boxes , rounds, sides, virt
2022-09-23 10:52:05 -07:00
%stack (c, a, b, d, e, F, K, boxes) -> (boxes, 1, a, b, c, d, F, K, e)
// stack: boxes, 1, a, b, c, d, F, K, e, rounds, sides, virt
2022-09-09 17:38:36 -07:00
SUB
SWAP7
2022-09-19 18:11:07 -07:00
// stack: e, a, b, c, d, F, K, boxes-1, rounds, sides, virt
2022-08-25 15:38:18 -07:00
%jump(round)
%macro get_round
// stack: sides, rounds
2022-09-22 08:38:23 -07:00
%mul_const(5)
PUSH 10
SUB
SUB
2022-08-25 15:38:18 -07:00
// stack: 10 - 5*sides - rounds
2022-09-08 15:47:18 -07:00
%endmacro
2022-08-25 15:38:18 -07:00
2022-09-16 19:18:26 -07:00
%macro get_box
2022-09-22 09:31:42 -07:00
// stack: ARGS: 7, boxes, rounds, sides
2022-09-09 17:38:36 -07:00
DUP10
%mul_const(80)
DUP10
%mul_const(16)
DUP10
2022-09-22 09:31:42 -07:00
// stack: boxes , 16*rounds , 80*sides, ARGS: 7, boxes, rounds, sides
2022-09-09 17:38:36 -07:00
PUSH 176
SUB
SUB
SUB
2022-09-22 09:31:42 -07:00
// stack: 176 - boxes - 16*rounds - 80*sides, ARGS: 7, boxes, rounds, sides
2022-09-08 15:47:18 -07:00
%endmacro