Coverage Report

Created: 2026-04-01 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/crypto/ml_dsa/ml_dsa_poly.h
Line
Count
Source
1
/*
2
 * Copyright 2024-2025 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
#include <openssl/crypto.h>
10
11
154M
#define ML_DSA_NUM_POLY_COEFFICIENTS 256
12
13
/* Polynomial object with 256 coefficients. The coefficients are unsigned 32 bits */
14
struct poly_st {
15
    uint32_t coeff[ML_DSA_NUM_POLY_COEFFICIENTS];
16
};
17
18
static ossl_inline ossl_unused void
19
poly_zero(POLY *p)
20
3.49k
{
21
3.49k
    memset(p->coeff, 0, sizeof(*p));
22
3.49k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_zero
Unexecuted instantiation: ml_dsa_key.c:poly_zero
Unexecuted instantiation: ml_dsa_matrix.c:poly_zero
Unexecuted instantiation: ml_dsa_ntt.c:poly_zero
ml_dsa_sample.c:poly_zero
Line
Count
Source
20
3.49k
{
21
3.49k
    memset(p->coeff, 0, sizeof(*p));
22
3.49k
}
Unexecuted instantiation: ml_dsa_sign.c:poly_zero
23
24
/**
25
 * @brief Polynomial addition.
26
 *
27
 * @param lhs A polynomial with coefficients in the range (0..q-1)
28
 * @param rhs A polynomial with coefficients in the range (0..q-1) to add
29
 *            to the 'lhs'.
30
 * @param out The returned addition result with the coefficients all in the
31
 *            range 0..q-1
32
 */
33
static ossl_inline ossl_unused void
34
poly_add(const POLY *lhs, const POLY *rhs, POLY *out)
35
183k
{
36
183k
    int i;
37
38
47.1M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
39
46.9M
        out->coeff[i] = reduce_once(lhs->coeff[i] + rhs->coeff[i]);
40
183k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_add
ml_dsa_key.c:poly_add
Line
Count
Source
35
9.58k
{
36
9.58k
    int i;
37
38
2.46M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
39
2.45M
        out->coeff[i] = reduce_once(lhs->coeff[i] + rhs->coeff[i]);
40
9.58k
}
ml_dsa_matrix.c:poly_add
Line
Count
Source
35
159k
{
36
159k
    int i;
37
38
40.9M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
39
40.8M
        out->coeff[i] = reduce_once(lhs->coeff[i] + rhs->coeff[i]);
40
159k
}
Unexecuted instantiation: ml_dsa_ntt.c:poly_add
Unexecuted instantiation: ml_dsa_sample.c:poly_add
ml_dsa_sign.c:poly_add
Line
Count
Source
35
14.2k
{
36
14.2k
    int i;
37
38
3.67M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
39
3.65M
        out->coeff[i] = reduce_once(lhs->coeff[i] + rhs->coeff[i]);
40
14.2k
}
41
42
/**
43
 * @brief Polynomial subtraction.
44
 *
45
 * @param lhs A polynomial with coefficients in the range (0..q-1)
46
 * @param rhs A polynomial with coefficients in the range (0..q-1) to subtract
47
 *            from the 'lhs'.
48
 * @param out The returned subtraction result with the coefficients all in the
49
 *            range 0..q-1
50
 */
51
static ossl_inline ossl_unused void
52
poly_sub(const POLY *lhs, const POLY *rhs, POLY *out)
53
19.8k
{
54
19.8k
    int i;
55
56
5.09M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
57
5.07M
        out->coeff[i] = mod_sub(lhs->coeff[i], rhs->coeff[i]);
58
19.8k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_sub
Unexecuted instantiation: ml_dsa_key.c:poly_sub
Unexecuted instantiation: ml_dsa_matrix.c:poly_sub
Unexecuted instantiation: ml_dsa_ntt.c:poly_sub
Unexecuted instantiation: ml_dsa_sample.c:poly_sub
ml_dsa_sign.c:poly_sub
Line
Count
Source
53
19.8k
{
54
19.8k
    int i;
55
56
5.09M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
57
5.07M
        out->coeff[i] = mod_sub(lhs->coeff[i], rhs->coeff[i]);
58
19.8k
}
59
60
/* @returns 1 if the polynomials are equal, or 0 otherwise */
61
static ossl_inline ossl_unused int
62
poly_equal(const POLY *a, const POLY *b)
63
1
{
64
1
    return CRYPTO_memcmp(a, b, sizeof(*a)) == 0;
65
1
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_equal
ml_dsa_key.c:poly_equal
Line
Count
Source
63
1
{
64
1
    return CRYPTO_memcmp(a, b, sizeof(*a)) == 0;
65
1
}
Unexecuted instantiation: ml_dsa_matrix.c:poly_equal
Unexecuted instantiation: ml_dsa_ntt.c:poly_equal
Unexecuted instantiation: ml_dsa_sample.c:poly_equal
Unexecuted instantiation: ml_dsa_sign.c:poly_equal
66
67
static ossl_inline ossl_unused void
68
poly_ntt(POLY *p)
69
3.49k
{
70
3.49k
    ossl_ml_dsa_poly_ntt(p);
71
3.49k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_ntt
Unexecuted instantiation: ml_dsa_key.c:poly_ntt
Unexecuted instantiation: ml_dsa_matrix.c:poly_ntt
Unexecuted instantiation: ml_dsa_ntt.c:poly_ntt
Unexecuted instantiation: ml_dsa_sample.c:poly_ntt
ml_dsa_sign.c:poly_ntt
Line
Count
Source
69
3.49k
{
70
3.49k
    ossl_ml_dsa_poly_ntt(p);
71
3.49k
}
72
73
static ossl_inline ossl_unused int
74
poly_sample_in_ball_ntt(POLY *out, const uint8_t *seed, int seed_len,
75
    EVP_MD_CTX *h_ctx, const EVP_MD *md, uint32_t tau)
76
3.49k
{
77
3.49k
    if (!ossl_ml_dsa_poly_sample_in_ball(out, seed, seed_len, h_ctx, md, tau))
78
0
        return 0;
79
3.49k
    poly_ntt(out);
80
3.49k
    return 1;
81
3.49k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_sample_in_ball_ntt
Unexecuted instantiation: ml_dsa_key.c:poly_sample_in_ball_ntt
Unexecuted instantiation: ml_dsa_matrix.c:poly_sample_in_ball_ntt
Unexecuted instantiation: ml_dsa_ntt.c:poly_sample_in_ball_ntt
Unexecuted instantiation: ml_dsa_sample.c:poly_sample_in_ball_ntt
ml_dsa_sign.c:poly_sample_in_ball_ntt
Line
Count
Source
76
3.49k
{
77
3.49k
    if (!ossl_ml_dsa_poly_sample_in_ball(out, seed, seed_len, h_ctx, md, tau))
78
0
        return 0;
79
3.49k
    poly_ntt(out);
80
3.49k
    return 1;
81
3.49k
}
82
83
static ossl_inline ossl_unused int
84
poly_expand_mask(POLY *out, const uint8_t *seed, size_t seed_len,
85
    uint32_t gamma1, EVP_MD_CTX *h_ctx, const EVP_MD *md)
86
14.2k
{
87
14.2k
    return ossl_ml_dsa_poly_expand_mask(out, seed, seed_len, gamma1, h_ctx, md);
88
14.2k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_expand_mask
Unexecuted instantiation: ml_dsa_key.c:poly_expand_mask
Unexecuted instantiation: ml_dsa_matrix.c:poly_expand_mask
Unexecuted instantiation: ml_dsa_ntt.c:poly_expand_mask
Unexecuted instantiation: ml_dsa_sample.c:poly_expand_mask
ml_dsa_sign.c:poly_expand_mask
Line
Count
Source
86
14.2k
{
87
14.2k
    return ossl_ml_dsa_poly_expand_mask(out, seed, seed_len, gamma1, h_ctx, md);
88
14.2k
}
89
90
/**
91
 * @brief Decompose the coefficients of a polynomial into (r1, r0) such that
92
 * coeff[i] == t1[i] * 2^13 + t0[i] mod q
93
 * See FIPS 204, Algorithm 35, Power2Round()
94
 *
95
 * @param t A polynomial containing coefficients in the range 0..q-1
96
 * @param t1 The returned polynomial containing coefficients that represent
97
 *           the top 10 MSB of each coefficient in t (i.e each ranging from 0..1023)
98
 * @param t0 The remainder coefficients of t in the range (0..4096 or q-4095..q-1)
99
 *           Each t0 coefficient has an effective range of 8192 (i.e. 13 bits).
100
 */
101
static ossl_inline ossl_unused void
102
poly_power2_round(const POLY *t, POLY *t1, POLY *t0)
103
9.58k
{
104
9.58k
    int i;
105
106
2.46M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
107
2.45M
        ossl_ml_dsa_key_compress_power2_round(t->coeff[i],
108
2.45M
            t1->coeff + i, t0->coeff + i);
109
9.58k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_power2_round
ml_dsa_key.c:poly_power2_round
Line
Count
Source
103
9.58k
{
104
9.58k
    int i;
105
106
2.46M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
107
2.45M
        ossl_ml_dsa_key_compress_power2_round(t->coeff[i],
108
2.45M
            t1->coeff + i, t0->coeff + i);
109
9.58k
}
Unexecuted instantiation: ml_dsa_matrix.c:poly_power2_round
Unexecuted instantiation: ml_dsa_ntt.c:poly_power2_round
Unexecuted instantiation: ml_dsa_sample.c:poly_power2_round
Unexecuted instantiation: ml_dsa_sign.c:poly_power2_round
110
111
static ossl_inline ossl_unused void
112
poly_scale_power2_round(POLY *in, POLY *out)
113
3.78k
{
114
3.78k
    int i;
115
116
971k
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
117
968k
        out->coeff[i] = (in->coeff[i] << ML_DSA_D_BITS);
118
3.78k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_scale_power2_round
Unexecuted instantiation: ml_dsa_key.c:poly_scale_power2_round
Unexecuted instantiation: ml_dsa_matrix.c:poly_scale_power2_round
Unexecuted instantiation: ml_dsa_ntt.c:poly_scale_power2_round
Unexecuted instantiation: ml_dsa_sample.c:poly_scale_power2_round
ml_dsa_sign.c:poly_scale_power2_round
Line
Count
Source
113
3.78k
{
114
3.78k
    int i;
115
116
971k
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
117
968k
        out->coeff[i] = (in->coeff[i] << ML_DSA_D_BITS);
118
3.78k
}
119
120
static ossl_inline ossl_unused void
121
poly_high_bits(const POLY *in, uint32_t gamma2, POLY *out)
122
16.0k
{
123
16.0k
    int i;
124
125
4.12M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
126
4.10M
        out->coeff[i] = ossl_ml_dsa_key_compress_high_bits(in->coeff[i], gamma2);
127
16.0k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_high_bits
Unexecuted instantiation: ml_dsa_key.c:poly_high_bits
Unexecuted instantiation: ml_dsa_matrix.c:poly_high_bits
Unexecuted instantiation: ml_dsa_ntt.c:poly_high_bits
Unexecuted instantiation: ml_dsa_sample.c:poly_high_bits
ml_dsa_sign.c:poly_high_bits
Line
Count
Source
122
16.0k
{
123
16.0k
    int i;
124
125
4.12M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
126
4.10M
        out->coeff[i] = ossl_ml_dsa_key_compress_high_bits(in->coeff[i], gamma2);
127
16.0k
}
128
129
static ossl_inline ossl_unused void
130
poly_low_bits(const POLY *in, uint32_t gamma2, POLY *out)
131
16.0k
{
132
16.0k
    int i;
133
134
4.12M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
135
4.10M
        out->coeff[i] = ossl_ml_dsa_key_compress_low_bits(in->coeff[i], gamma2);
136
16.0k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_low_bits
Unexecuted instantiation: ml_dsa_key.c:poly_low_bits
Unexecuted instantiation: ml_dsa_matrix.c:poly_low_bits
Unexecuted instantiation: ml_dsa_ntt.c:poly_low_bits
Unexecuted instantiation: ml_dsa_sample.c:poly_low_bits
ml_dsa_sign.c:poly_low_bits
Line
Count
Source
131
16.0k
{
132
16.0k
    int i;
133
134
4.12M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
135
4.10M
        out->coeff[i] = ossl_ml_dsa_key_compress_low_bits(in->coeff[i], gamma2);
136
16.0k
}
137
138
static ossl_inline ossl_unused void
139
poly_make_hint(const POLY *ct0, const POLY *cs2, const POLY *w, uint32_t gamma2,
140
    POLY *out)
141
3.80k
{
142
3.80k
    int i;
143
144
978k
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
145
974k
        out->coeff[i] = ossl_ml_dsa_key_compress_make_hint(ct0->coeff[i],
146
974k
            cs2->coeff[i],
147
974k
            gamma2, w->coeff[i]);
148
3.80k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_make_hint
Unexecuted instantiation: ml_dsa_key.c:poly_make_hint
Unexecuted instantiation: ml_dsa_matrix.c:poly_make_hint
Unexecuted instantiation: ml_dsa_ntt.c:poly_make_hint
Unexecuted instantiation: ml_dsa_sample.c:poly_make_hint
ml_dsa_sign.c:poly_make_hint
Line
Count
Source
141
3.80k
{
142
3.80k
    int i;
143
144
978k
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
145
974k
        out->coeff[i] = ossl_ml_dsa_key_compress_make_hint(ct0->coeff[i],
146
974k
            cs2->coeff[i],
147
974k
            gamma2, w->coeff[i]);
148
3.80k
}
149
150
static ossl_inline ossl_unused void
151
poly_use_hint(const POLY *h, const POLY *r, uint32_t gamma2, POLY *out)
152
3.78k
{
153
3.78k
    int i;
154
155
971k
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
156
968k
        out->coeff[i] = ossl_ml_dsa_key_compress_use_hint(h->coeff[i],
157
968k
            r->coeff[i], gamma2);
158
3.78k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_use_hint
Unexecuted instantiation: ml_dsa_key.c:poly_use_hint
Unexecuted instantiation: ml_dsa_matrix.c:poly_use_hint
Unexecuted instantiation: ml_dsa_ntt.c:poly_use_hint
Unexecuted instantiation: ml_dsa_sample.c:poly_use_hint
ml_dsa_sign.c:poly_use_hint
Line
Count
Source
152
3.78k
{
153
3.78k
    int i;
154
155
971k
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++)
156
968k
        out->coeff[i] = ossl_ml_dsa_key_compress_use_hint(h->coeff[i],
157
968k
            r->coeff[i], gamma2);
158
3.78k
}
159
160
static ossl_inline ossl_unused void
161
poly_max(const POLY *p, uint32_t *mx)
162
21.4k
{
163
21.4k
    int i;
164
165
5.51M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++) {
166
5.49M
        uint32_t c = p->coeff[i];
167
5.49M
        uint32_t abs = abs_mod_prime(c);
168
169
5.49M
        *mx = maximum(*mx, abs);
170
5.49M
    }
171
21.4k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_max
Unexecuted instantiation: ml_dsa_key.c:poly_max
Unexecuted instantiation: ml_dsa_matrix.c:poly_max
Unexecuted instantiation: ml_dsa_ntt.c:poly_max
Unexecuted instantiation: ml_dsa_sample.c:poly_max
ml_dsa_sign.c:poly_max
Line
Count
Source
162
21.4k
{
163
21.4k
    int i;
164
165
5.51M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++) {
166
5.49M
        uint32_t c = p->coeff[i];
167
5.49M
        uint32_t abs = abs_mod_prime(c);
168
169
5.49M
        *mx = maximum(*mx, abs);
170
5.49M
    }
171
21.4k
}
172
173
static ossl_inline ossl_unused void
174
poly_max_signed(const POLY *p, uint32_t *mx)
175
16.0k
{
176
16.0k
    int i;
177
178
4.12M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++) {
179
4.10M
        uint32_t c = p->coeff[i];
180
4.10M
        uint32_t abs = abs_signed(c);
181
182
4.10M
        *mx = maximum(*mx, abs);
183
4.10M
    }
184
16.0k
}
Unexecuted instantiation: ml_dsa_encoders.c:poly_max_signed
Unexecuted instantiation: ml_dsa_key.c:poly_max_signed
Unexecuted instantiation: ml_dsa_matrix.c:poly_max_signed
Unexecuted instantiation: ml_dsa_ntt.c:poly_max_signed
Unexecuted instantiation: ml_dsa_sample.c:poly_max_signed
ml_dsa_sign.c:poly_max_signed
Line
Count
Source
175
16.0k
{
176
16.0k
    int i;
177
178
4.12M
    for (i = 0; i < ML_DSA_NUM_POLY_COEFFICIENTS; i++) {
179
4.10M
        uint32_t c = p->coeff[i];
180
4.10M
        uint32_t abs = abs_signed(c);
181
182
4.10M
        *mx = maximum(*mx, abs);
183
4.10M
    }
184
16.0k
}