/* | |
This code is generated by the veri-titan project: https://github.com/secure-foundations/veri-titan | |
The mod_pow assembly snippet expects arguments in the following way: | |
a0: | |
@param d0inv Precomputed Montgomery constant, considered part of key d0inv=-n^(-1) mod R | |
a1: | |
@param out Output message as little-endian array | |
a2: | |
@param workbuf32 Work buffer, caller must verify this is 2 x RSANUMWORDS elements long. | |
a3: | |
@param rr Precomputed constant, (R*R) mod n, considered part of key | |
a4: | |
@param n Modulus of key | |
a5: | |
@param in Input signature as little-endian array | |
It should correspond to this C signature: | |
void mod_pow(const uint32_t d0inv, | |
uint32_t *out, | |
uint32_t *workbuf32, | |
const uint32_t * rr, | |
const uint32_t *n, | |
uint32_t *in) | |
*/ | |
.globl mod_pow | |
mod_pow: | |
addi sp, sp, -32 | |
sw ra, 28(sp) | |
sw s0, 24(sp) | |
sw s1, 20(sp) | |
sw s2, 16(sp) | |
sw s3, 12(sp) | |
sw s4, 8(sp) | |
sw s5, 4(sp) | |
sw s6, 0(sp) | |
addi s0, a2, 0 | |
addi s6, a4, 0 | |
addi s3, a0, 0 | |
addi s5, a5, 0 | |
addi s4, a1, 0 | |
addi s2, a2, 384 | |
addi a2, a3, 0 | |
addi a1, s0, 0 | |
addi a3, s5, 0 | |
call mont_mul | |
li s1, 8 | |
w_start0: | |
bleu s1, x0, w_end0 | |
addi a3, s0, 0 | |
addi a2, s0, 0 | |
addi a1, s2, 0 | |
addi a0, s3, 0 | |
addi a4, s6, 0 | |
call mont_mul | |
addi a3, s2, 0 | |
addi a2, s2, 0 | |
addi a1, s0, 0 | |
addi a0, s3, 0 | |
addi a4, s6, 0 | |
call mont_mul | |
addi s1, s1, -1 | |
j w_start0 | |
w_end0: | |
addi a0, s3, 0 | |
addi a3, s5, 0 | |
addi a2, s0, 0 | |
addi a1, s4, 0 | |
addi a4, s6, 0 | |
call mont_mul | |
addi a0, s4, 0 | |
addi a1, s6, 0 | |
call ge_mod | |
beq a0, x0, if_true1 | |
j if_end1 | |
if_true1: | |
addi a0, s4, 0 | |
addi a1, s6, 0 | |
call sub_mod | |
if_end1: | |
lw ra, 28(sp) | |
lw s0, 24(sp) | |
lw s1, 20(sp) | |
lw s2, 16(sp) | |
lw s3, 12(sp) | |
lw s4, 8(sp) | |
lw s5, 4(sp) | |
lw s6, 0(sp) | |
addi sp, sp, 32 | |
ret | |
mont_mul: | |
addi sp, sp, -28 | |
sw ra, 24(sp) | |
sw s0, 20(sp) | |
sw s1, 16(sp) | |
sw s2, 12(sp) | |
sw s3, 8(sp) | |
sw s4, 4(sp) | |
sw s5, 0(sp) | |
addi s0, a0, 0 | |
addi s1, a1, 0 | |
addi s2, a2, 0 | |
addi s3, a3, 0 | |
addi s5, a4, 0 | |
addi s4, s1, 384 | |
w_start2: | |
bgeu s1, s4, w_end2 | |
sw x0, 0(s1) | |
addi s1, s1, 4 | |
j w_start2 | |
w_end2: | |
addi s1, a1, 0 | |
addi s4, s2, 384 | |
w_start3: | |
bgeu s2, s4, w_end3 | |
addi a1, s1, 0 | |
addi a0, s0, 0 | |
addi a3, s3, 0 | |
addi a4, s5, 0 | |
lw a2, 0(s2) | |
call mont_mul_add | |
addi s2, s2, 4 | |
j w_start3 | |
w_end3: | |
lw ra, 24(sp) | |
lw s0, 20(sp) | |
lw s1, 16(sp) | |
lw s2, 12(sp) | |
lw s3, 8(sp) | |
lw s4, 4(sp) | |
lw s5, 0(sp) | |
addi sp, sp, 28 | |
ret | |
mont_mul_add: | |
addi sp, sp, -40 | |
sw ra, 36(sp) | |
sw s0, 32(sp) | |
sw s1, 28(sp) | |
sw s2, 24(sp) | |
sw s3, 20(sp) | |
sw s4, 16(sp) | |
sw s5, 12(sp) | |
sw s6, 8(sp) | |
sw s7, 4(sp) | |
sw s8, 0(sp) | |
addi s6, a1, 0 | |
lw a1, 0(a3) | |
addi s7, a2, 0 | |
lw a2, 0(s6) | |
addi s5, a0, 0 | |
addi a0, s7, 0 | |
addi s4, a3, 0 | |
call mula32 | |
mul s5, a0, s5 | |
addi s8, a4, 0 | |
addi s0, a1, 0 | |
lw a1, 0(s8) | |
addi a2, a0, 0 | |
addi s2, s8, 4 | |
addi s4, s4, 4 | |
addi s3, s6, 0 | |
addi s8, s8, 384 | |
addi a0, s5, 0 | |
call mula32 | |
addi s1, a1, 0 | |
w_start4: | |
bgeu s2, s8, w_end4 | |
lw a2, 4(s3) | |
lw a1, 0(s4) | |
addi a3, s0, 0 | |
addi a0, s7, 0 | |
call mulaa32 | |
addi s0, a1, 0 | |
lw a1, 0(s2) | |
addi a2, a0, 0 | |
addi a3, s1, 0 | |
addi a0, s5, 0 | |
call mulaa32 | |
sw a0, 0(s3) | |
addi s2, s2, 4 | |
addi s1, a1, 0 | |
addi s4, s4, 4 | |
addi s3, s3, 4 | |
j w_start4 | |
w_end4: | |
add s0, s0, s1 | |
sw s0, 0(s3) | |
bltu s0, s1, if_true5 | |
j if_end5 | |
if_true5: | |
addi a0, s6, 0 | |
addi a1, s2, -384 | |
call sub_mod | |
if_end5: | |
lw ra, 36(sp) | |
lw s0, 32(sp) | |
lw s1, 28(sp) | |
lw s2, 24(sp) | |
lw s3, 20(sp) | |
lw s4, 16(sp) | |
lw s5, 12(sp) | |
lw s6, 8(sp) | |
lw s7, 4(sp) | |
lw s8, 0(sp) | |
addi sp, sp, 40 | |
ret | |
mula32: | |
mul a5, a0, a1 | |
mulhu a1, a0, a1 | |
add a0, a5, a2 | |
sltu a5, a0, a5 | |
add a1, a1, a5 | |
ret | |
mulaa32: | |
mul a5, a0, a1 | |
mulhu a1, a0, a1 | |
add a0, a5, a2 | |
sltu a5, a0, a5 | |
add a1, a1, a5 | |
add a0, a0, a3 | |
sltu a5, a0, a3 | |
add a1, a1, a5 | |
ret | |
sub_mod: | |
addi a2, a1, 0 | |
addi a6, a2, 384 | |
li a5, 0 | |
li a1, 0 | |
w_start6: | |
beq a2, a6, w_end6 | |
lw a4, 0(a0) | |
lw a3, 0(a2) | |
addi a2, a2, 4 | |
add a5, a5, a4 | |
sub a3, a5, a3 | |
sltu a4, a5, a4 | |
add a4, a4, a1 | |
sltu a5, a5, a3 | |
sw a3, 0(a0) | |
addi a0, a0, 4 | |
sub a5, a4, a5 | |
srai a1, a5, 31 | |
j w_start6 | |
w_end6: | |
ret | |
ge_mod: | |
addi a0, a0, 380 | |
addi a5, a1, 380 | |
addi a2, x0, 1 | |
w_start7: | |
beq a2, x0, w_end7 | |
lw a3, 0(a0) | |
lw a4, 0(a5) | |
sub a2, a3, a4 | |
sltu a3, a3, a4 | |
sltu a4, x0, a2 | |
xor a2, a1, a5 | |
bne a4, x0, if_true8 | |
j if_end8 | |
if_true8: | |
add a2, x0, x0 | |
if_end8: | |
addi a0, a0, -4 | |
addi a5, a5, -4 | |
j w_start7 | |
w_end7: | |
addi a0, a3, 0 | |
ret | |