x64汇编

国密SM2素域椭圆曲线快速约减算法x64编程研究(上)

你离开我真会死。 提交于 2020-03-17 12:30:58
某厂面试归来,发现自己落伍了!>>> 这是NIST公开资料公布的256位素域椭圆曲线快速约减算法描述: p256 = (2 ^ 256) − (2 ^ 224) + (2 ^ 192) + (2 ^ 96) − 1 p256 = ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff Routine 3.2.9 mp_mod_256 (r, a): Set r = a (mod p256 ) 1: {Note: the ai are 32–bit quantities.} 2: t = ( a7 |a6 |a5 |a4 |a3 |a2 |a1 |a0 ) 3: s1 = ( a15|a14|a13|a12|a11| 0 | 0 | 0 ) 4: s2 = ( 0 |a15|a14|a13|a12| 0 | 0 | 0 ) 5: s3 = ( a15|a14| 0 | 0 | 0 |a10|a9 |a8 ) 6: s4 = ( a8 |a13|a15|a14|a13|a11|a10|a9 ) 7: d1 = ( a10|a8 | 0 | 0 | 0 |a13|a12|a11 ) 8: d2 = ( a11|a9 | 0 | 0 |a15|a14|a13|a12 ) 9: d3 = ( a12| 0

256位NIST素域椭圆曲线运算优化细节之一(单个素数p的加减法)

我怕爱的太早我们不能终老 提交于 2020-03-17 12:01:21
某厂面试归来,发现自己落伍了!>>> 在素域椭圆曲线运算过程中,256位加法和减法运算结果常常位于区间[0,p)之外的情形,需要做+p或是-p的运算 256位NIST素域椭圆曲线参数p的生成公式为: p = 2^256 − 2^224 + 2^192 + 2^96 − 1 按照符号将此式分解得: p = (2^256 + 2^192 + 2^96) - (2^224 + 1) 转化为16进制并按64位分节,变成下面的形式: +: 0000000000000001 0000000000000000 0000000100000000 0000000000000000 -: 0000000100000000 0000000000000000 0000000000000000 0000000000000001 =: ffffffff00000001 0000000000000000 00000000ffffffff ffffffffffffffff 仔细观察可以发现,所涉及64位加法和减法中,只出现一个64位立即数: 0000000100000000 假设某次256位减法最终发生借位,其低256位数值保存于寄存器r8:r11中,现在需要+p运算以修正之,若是用构成p的4个立即数直接运算的话,其代码如下: # -------------- # r8:r11 += p256 # -------