# 算法实现

多倍点算法规范文档中提到了三种算法,参见规范文档《A.3 椭圆曲线多倍点运算》

本文采用最简单的二进制展开法

void gm_point_mul(gm_point_t * r, const gm_bn_t k, const gm_point_t * p) {
    char bits[257] = {0};
    gm_point_t _q;
    gm_point_t * q = &_q;
    int i;

    gm_point_set_infinity(q);
    gm_bn_to_bits(k, bits);

    for (i = 0; i < 256; i++) {
        gm_point_double(q, q);
        if (bits[i] == '1') {
            gm_point_add(q, q, p);
        }
    }
    gm_point_copy(r, q);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 单元测试

test_ec函数增加:

else if(strcmp(alg, "point_mul") == 0){ // 1千
    gm_point_get_xy(&p2, k, NULL);
    for (i = 0; i < 1000; i++) {
        gm_point_mul(&r, k, &r);
    }
}
1
2
3
4
5
6

main函数增加:

TEST_EC_ALG("point_mul",
            "EB04AAE0D53FBA1E3611D5B9ED6EFA3EE5BA57C41AA7A09DDC5816AF09057757CE6FA0678392F4716E45F58E7322C76D5997B1FE44C36D8A5A59B146EE162B93",
            "AA307A6575D8348037CEC6F860F6312317B34C81838834EDB008F54A2E590FDC593293D89FE9C933E6CE7E91CD4ABF81EC3C26395622B65754A8C0EE8FB354E9",
            "6CBB13143526BE4C6565BA1061C5835E3C61A5DC10B6CD5824C1F6A93B368F6D86B89F0A0459A745F5A192827E5CDCE9CB035DBFEAC286ADCD8F62C4C028567B");
1
2
3
4

算法效率:

saintdeMacBook-Pro:bn saint$ time ./a.out point_mul
r = 6CBB13143526BE4C6565BA1061C5835E3C61A5DC10B6CD5824C1F6A93B368F6D86B89F0A0459A745F5A192827E5CDCE9CB035DBFEAC286ADCD8F62C4C028567B
test result: ok

real	0m6.242s
user	0m5.392s
sys	0m0.060s
1
2
3
4
5
6
7