GCC Code Coverage Report | |||||||||||||||||||||
|
|||||||||||||||||||||
Line | Branch | Exec | Source |
1 |
/* $OpenBSD: bn_kron.c,v 1.6 2015/02/09 15:49:22 jsing Exp $ */ |
||
2 |
/* ==================================================================== |
||
3 |
* Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. |
||
4 |
* |
||
5 |
* Redistribution and use in source and binary forms, with or without |
||
6 |
* modification, are permitted provided that the following conditions |
||
7 |
* are met: |
||
8 |
* |
||
9 |
* 1. Redistributions of source code must retain the above copyright |
||
10 |
* notice, this list of conditions and the following disclaimer. |
||
11 |
* |
||
12 |
* 2. Redistributions in binary form must reproduce the above copyright |
||
13 |
* notice, this list of conditions and the following disclaimer in |
||
14 |
* the documentation and/or other materials provided with the |
||
15 |
* distribution. |
||
16 |
* |
||
17 |
* 3. All advertising materials mentioning features or use of this |
||
18 |
* software must display the following acknowledgment: |
||
19 |
* "This product includes software developed by the OpenSSL Project |
||
20 |
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)" |
||
21 |
* |
||
22 |
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to |
||
23 |
* endorse or promote products derived from this software without |
||
24 |
* prior written permission. For written permission, please contact |
||
25 |
* openssl-core@openssl.org. |
||
26 |
* |
||
27 |
* 5. Products derived from this software may not be called "OpenSSL" |
||
28 |
* nor may "OpenSSL" appear in their names without prior written |
||
29 |
* permission of the OpenSSL Project. |
||
30 |
* |
||
31 |
* 6. Redistributions of any form whatsoever must retain the following |
||
32 |
* acknowledgment: |
||
33 |
* "This product includes software developed by the OpenSSL Project |
||
34 |
* for use in the OpenSSL Toolkit (http://www.openssl.org/)" |
||
35 |
* |
||
36 |
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY |
||
37 |
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||
38 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||
39 |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR |
||
40 |
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||
41 |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
||
42 |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||
43 |
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||
44 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
||
45 |
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||
46 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
||
47 |
* OF THE POSSIBILITY OF SUCH DAMAGE. |
||
48 |
* ==================================================================== |
||
49 |
* |
||
50 |
* This product includes cryptographic software written by Eric Young |
||
51 |
* (eay@cryptsoft.com). This product includes software written by Tim |
||
52 |
* Hudson (tjh@cryptsoft.com). |
||
53 |
* |
||
54 |
*/ |
||
55 |
|||
56 |
#include "bn_lcl.h" |
||
57 |
|||
58 |
/* least significant word */ |
||
59 |
#define BN_lsw(n) (((n)->top == 0) ? (BN_ULONG) 0 : (n)->d[0]) |
||
60 |
|||
61 |
/* Returns -2 for errors because both -1 and 0 are valid results. */ |
||
62 |
int |
||
63 |
BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) |
||
64 |
138 |
{ |
|
65 |
int i; |
||
66 |
138 |
int ret = -2; /* avoid 'uninitialized' warning */ |
|
67 |
138 |
int err = 0; |
|
68 |
BIGNUM *A, *B, *tmp; |
||
69 |
|||
70 |
/* In 'tab', only odd-indexed entries are relevant: |
||
71 |
* For any odd BIGNUM n, |
||
72 |
* tab[BN_lsw(n) & 7] |
||
73 |
* is $(-1)^{(n^2-1)/8}$ (using TeX notation). |
||
74 |
* Note that the sign of n does not matter. |
||
75 |
*/ |
||
76 |
static const int tab[8] = {0, 1, 0, -1, 0, -1, 0, 1}; |
||
77 |
|||
78 |
bn_check_top(a); |
||
79 |
bn_check_top(b); |
||
80 |
|||
81 |
138 |
BN_CTX_start(ctx); |
|
82 |
✓✗ | 138 |
if ((A = BN_CTX_get(ctx)) == NULL) |
83 |
goto end; |
||
84 |
✗✓ | 138 |
if ((B = BN_CTX_get(ctx)) == NULL) |
85 |
goto end; |
||
86 |
|||
87 |
138 |
err = !BN_copy(A, a); |
|
88 |
✗✓ | 138 |
if (err) |
89 |
goto end; |
||
90 |
138 |
err = !BN_copy(B, b); |
|
91 |
✗✓ | 138 |
if (err) |
92 |
goto end; |
||
93 |
|||
94 |
/* |
||
95 |
* Kronecker symbol, imlemented according to Henri Cohen, |
||
96 |
* "A Course in Computational Algebraic Number Theory" |
||
97 |
* (algorithm 1.4.10). |
||
98 |
*/ |
||
99 |
|||
100 |
/* Cohen's step 1: */ |
||
101 |
|||
102 |
✗✓ | 138 |
if (BN_is_zero(B)) { |
103 |
ret = BN_abs_is_word(A, 1); |
||
104 |
goto end; |
||
105 |
} |
||
106 |
|||
107 |
/* Cohen's step 2: */ |
||
108 |
|||
109 |
✓✗✓✓ ✓✗✗✓ |
138 |
if (!BN_is_odd(A) && !BN_is_odd(B)) { |
110 |
ret = 0; |
||
111 |
goto end; |
||
112 |
} |
||
113 |
|||
114 |
/* now B is non-zero */ |
||
115 |
138 |
i = 0; |
|
116 |
✗✓ | 276 |
while (!BN_is_bit_set(B, i)) |
117 |
i++; |
||
118 |
138 |
err = !BN_rshift(B, B, i); |
|
119 |
✗✓ | 138 |
if (err) |
120 |
goto end; |
||
121 |
✗✓ | 138 |
if (i & 1) { |
122 |
/* i is odd */ |
||
123 |
/* (thus B was even, thus A must be odd!) */ |
||
124 |
|||
125 |
/* set 'ret' to $(-1)^{(A^2-1)/8}$ */ |
||
126 |
ret = tab[BN_lsw(A) & 7]; |
||
127 |
} else { |
||
128 |
/* i is even */ |
||
129 |
138 |
ret = 1; |
|
130 |
} |
||
131 |
|||
132 |
✓✓ | 138 |
if (B->neg) { |
133 |
100 |
B->neg = 0; |
|
134 |
✓✓ | 100 |
if (A->neg) |
135 |
50 |
ret = -ret; |
|
136 |
} |
||
137 |
|||
138 |
/* now B is positive and odd, so what remains to be done is |
||
139 |
* to compute the Jacobi symbol (A/B) and multiply it by 'ret' */ |
||
140 |
|||
141 |
while (1) { |
||
142 |
/* Cohen's step 3: */ |
||
143 |
|||
144 |
/* B is positive and odd */ |
||
145 |
|||
146 |
✓✓ | 18651 |
if (BN_is_zero(A)) { |
147 |
✓✗✓✗ ✓✗ |
138 |
ret = BN_is_one(B) ? ret : 0; |
148 |
138 |
goto end; |
|
149 |
} |
||
150 |
|||
151 |
/* now A is non-zero */ |
||
152 |
18513 |
i = 0; |
|
153 |
✓✓ | 58156 |
while (!BN_is_bit_set(A, i)) |
154 |
21130 |
i++; |
|
155 |
18513 |
err = !BN_rshift(A, A, i); |
|
156 |
✗✓ | 18513 |
if (err) |
157 |
goto end; |
||
158 |
✓✓ | 18513 |
if (i & 1) { |
159 |
/* i is odd */ |
||
160 |
/* multiply 'ret' by $(-1)^{(B^2-1)/8}$ */ |
||
161 |
✓✗ | 6720 |
ret = ret * tab[BN_lsw(B) & 7]; |
162 |
} |
||
163 |
|||
164 |
/* Cohen's step 4: */ |
||
165 |
/* multiply 'ret' by $(-1)^{(A-1)(B-1)/4}$ */ |
||
166 |
✓✓✓✗ ✓✗✓✗ ✓✓ |
18513 |
if ((A->neg ? ~BN_lsw(A) : BN_lsw(A)) & BN_lsw(B) & 2) |
167 |
4560 |
ret = -ret; |
|
168 |
|||
169 |
/* (A, B) := (B mod |A|, |A|) */ |
||
170 |
18513 |
err = !BN_nnmod(B, B, A, ctx); |
|
171 |
✗✓ | 18513 |
if (err) |
172 |
goto end; |
||
173 |
18513 |
tmp = A; |
|
174 |
18513 |
A = B; |
|
175 |
18513 |
B = tmp; |
|
176 |
18513 |
tmp->neg = 0; |
|
177 |
18513 |
} |
|
178 |
|||
179 |
138 |
end: |
|
180 |
138 |
BN_CTX_end(ctx); |
|
181 |
✗✓ | 138 |
if (err) |
182 |
return -2; |
||
183 |
else |
||
184 |
138 |
return ret; |
|
185 |
} |
Generated by: GCOVR (Version 3.3) |