# CryptoLine - ecp_nistz256_add > [Academia Sinica IIS Intern [Learning] - CryptoLine](/tCNMWzNhQleOWtHmMwgE4w) ## ecp_nistz256_add.gas ```gas= #! $1c(%rdi) = %%EA #! (%rdi) = %%EA #! $1c(%rsi) = %%EA #! (%rsi) = %%EA #! $1c(%rdx) = %%EA #! (%rdx) = %%EA #! %r$1c = %%r$1c #! %rax = %%rax #! %rcx = %%rcx #! %rdx = %%rdx #! add $1ea, $2v -> adds carry $2v $2v $1ea #! adc $1ea, $2v -> adcs carry $2v $2v $1ea carry #! adc \$0x0, $1v -> adc $1v $1v 0@uint64 carry #! cmovb $1v, $2v -> cmov $2v carry $1v $2v #! mov $1v, $2v -> mov $2v $1v #! mov $1ea, $2v -> mov $2v $1ea #! mov $1v, $2ea -> mov $2ea $1v #! sub $1ea, $2v -> subb carry $2v $2v $1ea #! sbb $1ea, $2v -> sbbs carry $2v $2v $1ea carry #! sbb \$0x0, $1v -> sbbs carry $1v $1v 0@uint64 carry #! xor $1v, $1v -> mov $1v 0@uint64 #ecp_nistz256_add: # %rdi = 0x7fffffffda00 # %rsi = 0x7fffffffd9c0 # %rdx = 0x7fffffffd9e0 # %rcx = 0x7fffffffd9c0 # %r8 = 0x555555580c70 # %r9 = 0x7ffef3ff00000000 #! -> SP = 0x7fffffffd9b8 #push %r12 #! EA = L0x7fffffffd9b0; PC = 0x55555557c320 #push %r13 #! EA = L0x7fffffffd9a8; PC = 0x55555557c322 mov (%rsi),%r8 #! EA = L0x7fffffffd9c0; Value = 0x0000000000000008; PC = 0x55555557c324 xor %r13,%r13 #! PC = 0x55555557c327 mov 0x8(%rsi),%r9 #! EA = L0x7fffffffd9c8; Value = 0x0000000000000001; PC = 0x55555557c32a mov 0x10(%rsi),%r10 #! EA = L0x7fffffffd9d0; Value = 0x00007fffffffdb28; PC = 0x55555557c32e mov 0x18(%rsi),%r11 #! EA = L0x7fffffffd9d8; Value = 0x00007fffffffdb38; PC = 0x55555557c332 #lea -0x33d(%rip),%rsi # 0x55555557c000#! PC = 0x55555557c336 add (%rdx),%r8 #! EA = L0x7fffffffd9e0; Value = 0x0000555555582d98; PC = 0x55555557c33d adc 0x8(%rdx),%r9 #! EA = L0x7fffffffd9e8; Value = 0x000055555555501b; PC = 0x55555557c340 mov %r8,%rax #! PC = 0x55555557c344 adc 0x10(%rdx),%r10 #! EA = L0x7fffffffd9f0; Value = 0x00007fffffffda16; PC = 0x55555557c347 adc 0x18(%rdx),%r11 #! EA = L0x7fffffffd9f8; Value = 0x0000555555580cbd; PC = 0x55555557c34b mov %r9,%rdx #! PC = 0x55555557c34f adc $0x0,%r13 #! PC = 0x55555557c352 sub (%rsi),%r8 #! EA = L0x55555557c000; Value = 0xffffffffffffffff; PC = 0x55555557c356 mov %r10,%rcx #! PC = 0x55555557c359 sbb 0x8(%rsi),%r9 #! EA = L0x55555557c008; Value = 0x00000000ffffffff; PC = 0x55555557c35c sbb 0x10(%rsi),%r10 #! EA = L0x55555557c010; Value = 0x0000000000000000; PC = 0x55555557c360 mov %r11,%r12 #! PC = 0x55555557c364 sbb 0x18(%rsi),%r11 #! EA = L0x55555557c018; Value = 0xffffffff00000001; PC = 0x55555557c367 sbb $0x0,%r13 #! PC = 0x55555557c36b cmovb %rax,%r8 #! PC = 0x55555557c36f cmovb %rdx,%r9 #! PC = 0x55555557c373 mov %r8,(%rdi) #! EA = L0x7fffffffda00; PC = 0x55555557c377 cmovb %rcx,%r10 #! PC = 0x55555557c37a mov %r9,0x8(%rdi) #! EA = L0x7fffffffda08; PC = 0x55555557c37e cmovb %r12,%r11 #! PC = 0x55555557c382 mov %r10,0x10(%rdi) #! EA = L0x7fffffffda10; PC = 0x55555557c386 mov %r11,0x18(%rdi) #! EA = L0x7fffffffda18; PC = 0x55555557c38a #mov (%rsp),%r13 #! EA = L0x7fffffffd9a8; Value = 0x00007fffffffdb20; PC = 0x55555557c38e #mov 0x8(%rsp),%r12 #! EA = L0x7fffffffd9b0; Value = 0x0000555555556000; PC = 0x55555557c392 #lea 0x10(%rsp),%rsp #! PC = 0x55555557c397 #! <- SP = 0x7fffffffd9b8 #repz retq #! PC = 0x55555557c39c ``` ## ecp_nistz256_add.cl - [Before] ```cl= proc main (L0x55555557c000, L0x55555557c008, L0x55555557c010, L0x55555557c018, L0x7fffffffd9c0, L0x7fffffffd9c8, L0x7fffffffd9d0, L0x7fffffffd9d8, L0x7fffffffd9e0, L0x7fffffffd9e8, L0x7fffffffd9f0, L0x7fffffffd9f8) = { true && true } (* #! -> SP = 0x7fffffffd9b8 *) #! 0x7fffffffd9b8 = 0x7fffffffd9b8; (* #push %r12 #! EA = L0x7fffffffd9b0; PC = 0x55555557c320 *) #push %%r12 #! L0x7fffffffd9b0 = L0x7fffffffd9b0; 0x55555557c320 = 0x55555557c320; (* #push %r13 #! EA = L0x7fffffffd9a8; PC = 0x55555557c322 *) #push %%r13 #! L0x7fffffffd9a8 = L0x7fffffffd9a8; 0x55555557c322 = 0x55555557c322; (* mov (%rsi),%r8 #! EA = L0x7fffffffd9c0; Value = 0x0000000000000008; PC = 0x55555557c324 *) mov r8 L0x7fffffffd9c0; (* xor %r13,%r13 #! PC = 0x55555557c327 *) mov r13 0@uint64; (* mov 0x8(%rsi),%r9 #! EA = L0x7fffffffd9c8; Value = 0x0000000000000001; PC = 0x55555557c32a *) mov r9 L0x7fffffffd9c8; (* mov 0x10(%rsi),%r10 #! EA = L0x7fffffffd9d0; Value = 0x00007fffffffdb28; PC = 0x55555557c32e *) mov r10 L0x7fffffffd9d0; (* mov 0x18(%rsi),%r11 #! EA = L0x7fffffffd9d8; Value = 0x00007fffffffdb38; PC = 0x55555557c332 *) mov r11 L0x7fffffffd9d8; (* #lea -0x33d(%rip),%rsi # 0x55555557c000#! PC = 0x55555557c336 *) #lea -0x33d(%rip),%rsi # 0x55555557c000#! 0x55555557c336 = 0x55555557c336; (* add (%rdx),%r8 #! EA = L0x7fffffffd9e0; Value = 0x0000555555582d98; PC = 0x55555557c33d *) adds carry r8 r8 L0x7fffffffd9e0; (* adc 0x8(%rdx),%r9 #! EA = L0x7fffffffd9e8; Value = 0x000055555555501b; PC = 0x55555557c340 *) adcs carry r9 r9 L0x7fffffffd9e8 carry; (* mov %r8,%rax #! PC = 0x55555557c344 *) mov rax r8; (* adc 0x10(%rdx),%r10 #! EA = L0x7fffffffd9f0; Value = 0x00007fffffffda16; PC = 0x55555557c347 *) adcs carry r10 r10 L0x7fffffffd9f0 carry; (* adc 0x18(%rdx),%r11 #! EA = L0x7fffffffd9f8; Value = 0x0000555555580cbd; PC = 0x55555557c34b *) adcs carry r11 r11 L0x7fffffffd9f8 carry; (* mov %r9,%rdx #! PC = 0x55555557c34f *) mov rdx r9; (* adc $0x0,%r13 #! PC = 0x55555557c352 *) adc r13 r13 0@uint64 carry; (* sub (%rsi),%r8 #! EA = L0x55555557c000; Value = 0xffffffffffffffff; PC = 0x55555557c356 *) subb carry r8 r8 L0x55555557c000; (* mov %r10,%rcx #! PC = 0x55555557c359 *) mov rcx r10; (* sbb 0x8(%rsi),%r9 #! EA = L0x55555557c008; Value = 0x00000000ffffffff; PC = 0x55555557c35c *) sbbs carry r9 r9 L0x55555557c008 carry; (* sbb 0x10(%rsi),%r10 #! EA = L0x55555557c010; Value = 0x0000000000000000; PC = 0x55555557c360 *) sbbs carry r10 r10 L0x55555557c010 carry; (* mov %r11,%r12 #! PC = 0x55555557c364 *) mov r12 r11; (* sbb 0x18(%rsi),%r11 #! EA = L0x55555557c018; Value = 0xffffffff00000001; PC = 0x55555557c367 *) sbbs carry r11 r11 L0x55555557c018 carry; (* sbb $0x0,%r13 #! PC = 0x55555557c36b *) sbbs carry r13 r13 0@uint64 carry; (* cmovb %rax,%r8 #! PC = 0x55555557c36f *) cmov r8 carry rax r8; (* cmovb %rdx,%r9 #! PC = 0x55555557c373 *) cmov r9 carry rdx r9; (* mov %r8,(%rdi) #! EA = L0x7fffffffda00; PC = 0x55555557c377 *) mov L0x7fffffffda00 r8; (* cmovb %rcx,%r10 #! PC = 0x55555557c37a *) cmov r10 carry rcx r10; (* mov %r9,0x8(%rdi) #! EA = L0x7fffffffda08; PC = 0x55555557c37e *) mov L0x7fffffffda08 r9; (* cmovb %r12,%r11 #! PC = 0x55555557c382 *) cmov r11 carry r12 r11; (* mov %r10,0x10(%rdi) #! EA = L0x7fffffffda10; PC = 0x55555557c386 *) mov L0x7fffffffda10 r10; (* mov %r11,0x18(%rdi) #! EA = L0x7fffffffda18; PC = 0x55555557c38a *) mov L0x7fffffffda18 r11; (* #mov (%rsp),%r13 #! EA = L0x7fffffffd9a8; Value = 0x00007fffffffdb20; PC = 0x55555557c38e *) #mov (%rsp),%%r13 #! L0x7fffffffd9a8 = L0x7fffffffd9a8; 0x00007fffffffdb20 = 0x00007fffffffdb20; 0x55555557c38e = 0x55555557c38e; (* #mov 0x8(%rsp),%r12 #! EA = L0x7fffffffd9b0; Value = 0x0000555555556000; PC = 0x55555557c392 *) #mov 0x8(%rsp),%%r12 #! L0x7fffffffd9b0 = L0x7fffffffd9b0; 0x0000555555556000 = 0x0000555555556000; 0x55555557c392 = 0x55555557c392; (* #lea 0x10(%rsp),%rsp #! PC = 0x55555557c397 *) #lea 0x10(%rsp),%rsp #! 0x55555557c397 = 0x55555557c397; (* #! <- SP = 0x7fffffffd9b8 *) #! 0x7fffffffd9b8 = 0x7fffffffd9b8; (* #repz retq #! PC = 0x55555557c39c *) #repz retq #! 0x55555557c39c = 0x55555557c39c; { true && true } ``` ## ecp_nistz256_add.cl - [After] ```cl= proc main (uint64 a0, uint64 a1, uint64 a2, uint64 a3, uint64 b0, uint64 b1, uint64 b2, uint64 b3, uint64 p0, uint64 p1, uint64 p2, uint64 p3) = { true && and [ p0 = 0xffffffffffffffff@64, p1 = 0x00000000ffffffff@64, p2 = 0x0000000000000000@64, p3 = 0xffffffff00000001@64, limbs 64 [a0, a1, a2, a3] <u limbs 64 [p0, p1, p2, p3], limbs 64 [b0, b1, b2, b3] <u limbs 64 [p0, p1, p2, p3] ] } mov L0x7fffffffd9c0 a0; mov L0x7fffffffd9c8 a1; mov L0x7fffffffd9d0 a2; mov L0x7fffffffd9d8 a3; mov L0x7fffffffd9e0 b0; mov L0x7fffffffd9e8 b1; mov L0x7fffffffd9f0 b2; mov L0x7fffffffd9f8 b3; mov L0x55555557c000 0xffffffffffffffff@uint64; mov L0x55555557c008 0x00000000ffffffff@uint64; mov L0x55555557c010 0x0000000000000000@uint64; mov L0x55555557c018 0xffffffff00000001@uint64; (* #! -> SP = 0x7fffffffd9b8 *) #! 0x7fffffffd9b8 = 0x7fffffffd9b8; (* #push %r12 #! EA = L0x7fffffffd9b0; PC = 0x55555557c320 *) #push %%r12 #! L0x7fffffffd9b0 = L0x7fffffffd9b0; 0x55555557c320 = 0x55555557c320; (* #push %r13 #! EA = L0x7fffffffd9a8; PC = 0x55555557c322 *) #push %%r13 #! L0x7fffffffd9a8 = L0x7fffffffd9a8; 0x55555557c322 = 0x55555557c322; (* mov (%rsi),%r8 #! EA = L0x7fffffffd9c0; Value = 0x0000000000000008; PC = 0x55555557c324 *) mov r8 L0x7fffffffd9c0; (* xor %r13,%r13 #! PC = 0x55555557c327 *) mov r13 0@uint64; (* mov 0x8(%rsi),%r9 #! EA = L0x7fffffffd9c8; Value = 0x0000000000000001; PC = 0x55555557c32a *) mov r9 L0x7fffffffd9c8; (* mov 0x10(%rsi),%r10 #! EA = L0x7fffffffd9d0; Value = 0x00007fffffffdb28; PC = 0x55555557c32e *) mov r10 L0x7fffffffd9d0; (* mov 0x18(%rsi),%r11 #! EA = L0x7fffffffd9d8; Value = 0x00007fffffffdb38; PC = 0x55555557c332 *) mov r11 L0x7fffffffd9d8; (* #lea -0x33d(%rip),%rsi # 0x55555557c000#! PC = 0x55555557c336 *) #lea -0x33d(%rip),%rsi # 0x55555557c000#! 0x55555557c336 = 0x55555557c336; (* add (%rdx),%r8 #! EA = L0x7fffffffd9e0; Value = 0x0000555555582d98; PC = 0x55555557c33d *) adds carry r8 r8 L0x7fffffffd9e0; (* adc 0x8(%rdx),%r9 #! EA = L0x7fffffffd9e8; Value = 0x000055555555501b; PC = 0x55555557c340 *) adcs carry r9 r9 L0x7fffffffd9e8 carry; (* mov %r8,%rax #! PC = 0x55555557c344 *) mov rax r8; (* adc 0x10(%rdx),%r10 #! EA = L0x7fffffffd9f0; Value = 0x00007fffffffda16; PC = 0x55555557c347 *) adcs carry r10 r10 L0x7fffffffd9f0 carry; (* adc 0x18(%rdx),%r11 #! EA = L0x7fffffffd9f8; Value = 0x0000555555580cbd; PC = 0x55555557c34b *) adcs carry r11 r11 L0x7fffffffd9f8 carry; (* mov %r9,%rdx #! PC = 0x55555557c34f *) mov rdx r9; (* adc $0x0,%r13 #! PC = 0x55555557c352 *) adc r13 r13 0@uint64 carry; (* sub (%rsi),%r8 #! EA = L0x55555557c000; Value = 0xffffffffffffffff; PC = 0x55555557c356 *) subb carry r8 r8 L0x55555557c000; (* mov %r10,%rcx #! PC = 0x55555557c359 *) mov rcx r10; (* sbb 0x8(%rsi),%r9 #! EA = L0x55555557c008; Value = 0x00000000ffffffff; PC = 0x55555557c35c *) sbbs carry r9 r9 L0x55555557c008 carry; (* sbb 0x10(%rsi),%r10 #! EA = L0x55555557c010; Value = 0x0000000000000000; PC = 0x55555557c360 *) sbbs carry r10 r10 L0x55555557c010 carry; (* mov %r11,%r12 #! PC = 0x55555557c364 *) mov r12 r11; (* sbb 0x18(%rsi),%r11 #! EA = L0x55555557c018; Value = 0xffffffff00000001; PC = 0x55555557c367 *) sbbs carry r11 r11 L0x55555557c018 carry; (* sbb $0x0,%r13 #! PC = 0x55555557c36b *) sbbs carry r13 r13 0@uint64 carry; (* cmovb %rax,%r8 #! PC = 0x55555557c36f *) cmov r8 carry rax r8; (* cmovb %rdx,%r9 #! PC = 0x55555557c373 *) cmov r9 carry rdx r9; (* mov %r8,(%rdi) #! EA = L0x7fffffffda00; PC = 0x55555557c377 *) mov L0x7fffffffda00 r8; (* cmovb %rcx,%r10 #! PC = 0x55555557c37a *) cmov r10 carry rcx r10; (* mov %r9,0x8(%rdi) #! EA = L0x7fffffffda08; PC = 0x55555557c37e *) mov L0x7fffffffda08 r9; (* cmovb %r12,%r11 #! PC = 0x55555557c382 *) cmov r11 carry r12 r11; (* mov %r10,0x10(%rdi) #! EA = L0x7fffffffda10; PC = 0x55555557c386 *) mov L0x7fffffffda10 r10; (* mov %r11,0x18(%rdi) #! EA = L0x7fffffffda18; PC = 0x55555557c38a *) mov L0x7fffffffda18 r11; (* #mov (%rsp),%r13 #! EA = L0x7fffffffd9a8; Value = 0x00007fffffffdb20; PC = 0x55555557c38e *) #mov (%rsp),%%r13 #! L0x7fffffffd9a8 = L0x7fffffffd9a8; 0x00007fffffffdb20 = 0x00007fffffffdb20; 0x55555557c38e = 0x55555557c38e; (* #mov 0x8(%rsp),%r12 #! EA = L0x7fffffffd9b0; Value = 0x0000555555556000; PC = 0x55555557c392 *) #mov 0x8(%rsp),%%r12 #! L0x7fffffffd9b0 = L0x7fffffffd9b0; 0x0000555555556000 = 0x0000555555556000; 0x55555557c392 = 0x55555557c392; (* #lea 0x10(%rsp),%rsp #! PC = 0x55555557c397 *) #lea 0x10(%rsp),%rsp #! 0x55555557c397 = 0x55555557c397; (* #! <- SP = 0x7fffffffd9b8 *) #! 0x7fffffffd9b8 = 0x7fffffffd9b8; (* #repz retq #! PC = 0x55555557c39c *) #repz retq #! 0x55555557c39c = 0x55555557c39c; mov c0 L0x7fffffffda00; mov c1 L0x7fffffffda08; mov c2 L0x7fffffffda10; mov c3 L0x7fffffffda18; { true && and [eqmod (limbs 64 [c0, c1, c2, c3, 0@64]) (limbs 64 [a0, a1, a2, a3, 0@64] + limbs 64 [b0, b1, b2, b3, 0@64]) (limbs 64 [p0, p1, p2, p3, 0@64]), limbs 64 [c0, c1, c2, c3] <u limbs 64 [p0, p1, p2, p3] ] } ``` ## 分析過程紀錄 | L0x7fffffffd9c0 | L0x7fffffffd9c8 | L0x7fffffffd9d0 | L0x7fffffffd9d8 | | --------------- | --------------- | --------------- | --------------- | | a0 | a1 | a2 | a3 | | r8 | r9 | r10 | r11 | | a~0~ + b~0~ | a~1~ + b~1~ | a~2~ + b~2~ | a~3~ + b~3~ | | L0x7fffffffd9e0 | L0x7fffffffd9e8 | L0x7fffffffd9f0 | L0x7fffffffd9f8 | | --------------- | --------------- | --------------- | --------------- | | b0 | b1 | b2 | b3 | | L0x55555557c000 | L0x55555557c008 | L0x55555557c010 | L0x55555557c018 | | ------------------ | ------------------ | ------------------ | ------------------ | | 0xffffffffffffffff | 0x00000000ffffffff | 0x0000000000000000 | 0xffffffff00000001 | - 加法 ```= adds carry r8 r8 L0x7fffffffd9e0; adcs carry r9 r9 L0x7fffffffd9e8 carry; adcs carry r10 r10 L0x7fffffffd9f0 carry; adcs carry r11 r11 L0x7fffffffd9f8 carry; ``` > a~0~ + b~0~,結果放 r8 > a~1~ + b~1~ ,結果放在 r9 > a~2~ + b~2~ ,結果放在 r10 > a~3~ + b~3~ ,結果放在 r11 - 處理進位 ```=+ mov r13 0@uint64; adc r13 r13 0@uint64 carry; ``` > 將 carry 放置 r13 - 放置結果到暫存器 ```=+ mov rax r8; mov rdx r9; mov rcx r10; mov r12 r11; ``` - 處理 mod ```=+ subb carry r8 r8 L0x55555557c000; sbbs carry r9 r9 L0x55555557c008 carry; sbbs carry r10 r10 L0x55555557c010 carry; sbbs carry r11 r11 L0x55555557c018 carry; sbbs carry r13 r13 0@uint64 carry; ``` ```=+ cmov r8 carry rax r8; cmov r9 carry rdx r9; cmov r10 carry rcx r10; cmov r11 carry r12 r11; ``` - 結果 ```=+ mov L0x7fffffffda00 r8; mov L0x7fffffffda08 r9; mov L0x7fffffffda10 r10; mov L0x7fffffffda18 r11; mov c0 L0x7fffffffda00; mov c1 L0x7fffffffda08; mov c2 L0x7fffffffda10; mov c3 L0x7fffffffda18; ``` ## 指令說明 與 操作 - precondition and postcondition - 將變數設定他們的位址 - `mov L0x7fffffffd9c0 a0;` - `mov L0x7fffffffd9e0 b0;` - `mov L0x55555557c000 0xffffffffffffffff@uint64;`