Coverage Report

Created: 2026-02-14 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/blst/src/exp.c
Line
Count
Source
1
/*
2
 * Copyright Supranational LLC
3
 * Licensed under the Apache License, Version 2.0, see LICENSE for details.
4
 * SPDX-License-Identifier: Apache-2.0
5
 */
6
7
#include "vect.h"
8
9
/*
10
 * |out| = |inp|^|pow|, small footprint, public exponent
11
 */
12
static void exp_mont_384(vec384 out, const vec384 inp, const byte *pow,
13
                         size_t pow_bits, const vec384 p, limb_t n0)
14
0
{
15
0
#if 1
16
0
    vec384 ret;
17
0
18
0
    vec_copy(ret, inp, sizeof(ret));  /* ret = inp^1 */
19
0
    --pow_bits; /* most significant bit is set, skip over */
20
0
    while (pow_bits--) {
21
0
        sqr_mont_384(ret, ret, p, n0);
22
0
        if (is_bit_set(pow, pow_bits))
23
0
            mul_mont_384(ret, ret, inp, p, n0);
24
0
    }
25
0
    vec_copy(out, ret, sizeof(ret));  /* out = ret */
26
0
#else
27
0
    unsigned int i;
28
0
    vec384 sqr;
29
0
30
0
    vec_copy(sqr, inp, sizeof(sqr));
31
0
    for (i = 0; !is_bit_set(pow, i++);)
32
0
        sqr_mont_384(sqr, sqr, sqr, p, n0);
33
0
    vec_copy(out, sqr, sizeof(sqr));
34
0
    for (; i < pow_bits; i++) {
35
0
        sqr_mont_384(sqr, sqr, sqr, p, n0);
36
0
        if (is_bit_set(pow, i))
37
0
            mul_mont_384(out, out, sqr, p, n0);
38
0
    }
39
0
#endif
40
0
}
41
42
static void exp_mont_384x(vec384x out, const vec384x inp, const byte *pow,
43
                          size_t pow_bits, const vec384 p, limb_t n0)
44
0
{
45
0
    vec384x ret;
46
0
47
0
    vec_copy(ret, inp, sizeof(ret));  /* |ret| = |inp|^1 */
48
0
    --pow_bits; /* most significant bit is accounted for, skip over */
49
0
    while (pow_bits--) {
50
0
        sqr_mont_384x(ret, ret, p, n0);
51
0
        if (is_bit_set(pow, pow_bits))
52
0
            mul_mont_384x(ret, ret, inp, p, n0);
53
0
    }
54
0
    vec_copy(out, ret, sizeof(ret));  /* |out| = |ret| */
55
0
}