]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bearssl/src/int/i31_moddiv.c
MFV r348580: 9559 zfs diff handles files on delete queue in fromsnap poorly
[FreeBSD/FreeBSD.git] / contrib / bearssl / src / int / i31_moddiv.c
1 /*
2  * Copyright (c) 2018 Thomas Pornin <pornin@bolet.org>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining 
5  * a copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be 
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24
25 #include "inner.h"
26
27 /*
28  * In this file, we handle big integers with a custom format, i.e.
29  * without the usual one-word header. Value is split into 31-bit words,
30  * each stored in a 32-bit slot (top bit is zero) in little-endian
31  * order. The length (in words) is provided explicitly. In some cases,
32  * the value can be negative (using two's complement representation). In
33  * some cases, the top word is allowed to have a 32th bit.
34  */
35
36 /*
37  * Negate big integer conditionally. The value consists of 'len' words,
38  * with 31 bits in each word (the top bit of each word should be 0,
39  * except possibly for the last word). If 'ctl' is 1, the negation is
40  * computed; otherwise, if 'ctl' is 0, then the value is unchanged.
41  */
42 static void
43 cond_negate(uint32_t *a, size_t len, uint32_t ctl)
44 {
45         size_t k;
46         uint32_t cc, xm;
47
48         cc = ctl;
49         xm = -ctl >> 1;
50         for (k = 0; k < len; k ++) {
51                 uint32_t aw;
52
53                 aw = a[k];
54                 aw = (aw ^ xm) + cc;
55                 a[k] = aw & 0x7FFFFFFF;
56                 cc = aw >> 31;
57         }
58 }
59
60 /*
61  * Finish modular reduction. Rules on input parameters:
62  *
63  *   if neg = 1, then -m <= a < 0
64  *   if neg = 0, then 0 <= a < 2*m
65  *
66  * If neg = 0, then the top word of a[] may use 32 bits.
67  *
68  * Also, modulus m must be odd.
69  */
70 static void
71 finish_mod(uint32_t *a, size_t len, const uint32_t *m, uint32_t neg)
72 {
73         size_t k;
74         uint32_t cc, xm, ym;
75
76         /*
77          * First pass: compare a (assumed nonnegative) with m.
78          * Note that if the final word uses the top extra bit, then
79          * subtracting m must yield a value less than 2^31, since we
80          * assumed that a < 2*m.
81          */
82         cc = 0;
83         for (k = 0; k < len; k ++) {
84                 uint32_t aw, mw;
85
86                 aw = a[k];
87                 mw = m[k];
88                 cc = (aw - mw - cc) >> 31;
89         }
90
91         /*
92          * At this point:
93          *   if neg = 1, then we must add m (regardless of cc)
94          *   if neg = 0 and cc = 0, then we must subtract m
95          *   if neg = 0 and cc = 1, then we must do nothing
96          */
97         xm = -neg >> 1;
98         ym = -(neg | (1 - cc));
99         cc = neg;
100         for (k = 0; k < len; k ++) {
101                 uint32_t aw, mw;
102
103                 aw = a[k];
104                 mw = (m[k] ^ xm) & ym;
105                 aw = aw - mw - cc;
106                 a[k] = aw & 0x7FFFFFFF;
107                 cc = aw >> 31;
108         }
109 }
110
111 /*
112  * Compute:
113  *   a <- (a*pa+b*pb)/(2^31)
114  *   b <- (a*qa+b*qb)/(2^31)
115  * The division is assumed to be exact (i.e. the low word is dropped).
116  * If the final a is negative, then it is negated. Similarly for b.
117  * Returned value is the combination of two bits:
118  *   bit 0: 1 if a had to be negated, 0 otherwise
119  *   bit 1: 1 if b had to be negated, 0 otherwise
120  *
121  * Factors pa, pb, qa and qb must be at most 2^31 in absolute value.
122  * Source integers a and b must be nonnegative; top word is not allowed
123  * to contain an extra 32th bit.
124  */
125 static uint32_t
126 co_reduce(uint32_t *a, uint32_t *b, size_t len,
127         int64_t pa, int64_t pb, int64_t qa, int64_t qb)
128 {
129         size_t k;
130         int64_t cca, ccb;
131         uint32_t nega, negb;
132
133         cca = 0;
134         ccb = 0;
135         for (k = 0; k < len; k ++) {
136                 uint32_t wa, wb;
137                 uint64_t za, zb;
138                 uint64_t tta, ttb;
139
140                 /*
141                  * Since:
142                  *   |pa| <= 2^31
143                  *   |pb| <= 2^31
144                  *   0 <= wa <= 2^31 - 1
145                  *   0 <= wb <= 2^31 - 1
146                  *   |cca| <= 2^32 - 1
147                  * Then:
148                  *   |za| <= (2^31-1)*(2^32) + (2^32-1) = 2^63 - 1
149                  *
150                  * Thus, the new value of cca is such that |cca| <= 2^32 - 1.
151                  * The same applies to ccb.
152                  */
153                 wa = a[k];
154                 wb = b[k];
155                 za = wa * (uint64_t)pa + wb * (uint64_t)pb + (uint64_t)cca;
156                 zb = wa * (uint64_t)qa + wb * (uint64_t)qb + (uint64_t)ccb;
157                 if (k > 0) {
158                         a[k - 1] = za & 0x7FFFFFFF;
159                         b[k - 1] = zb & 0x7FFFFFFF;
160                 }
161
162                 /*
163                  * For the new values of cca and ccb, we need a signed
164                  * right-shift; since, in C, right-shifting a signed
165                  * negative value is implementation-defined, we use a
166                  * custom portable sign extension expression.
167                  */
168 #define M   ((uint64_t)1 << 32)
169                 tta = za >> 31;
170                 ttb = zb >> 31;
171                 tta = (tta ^ M) - M;
172                 ttb = (ttb ^ M) - M;
173                 cca = *(int64_t *)&tta;
174                 ccb = *(int64_t *)&ttb;
175 #undef M
176         }
177         a[len - 1] = (uint32_t)cca;
178         b[len - 1] = (uint32_t)ccb;
179
180         nega = (uint32_t)((uint64_t)cca >> 63);
181         negb = (uint32_t)((uint64_t)ccb >> 63);
182         cond_negate(a, len, nega);
183         cond_negate(b, len, negb);
184         return nega | (negb << 1);
185 }
186
187 /*
188  * Compute:
189  *   a <- (a*pa+b*pb)/(2^31) mod m
190  *   b <- (a*qa+b*qb)/(2^31) mod m
191  *
192  * m0i is equal to -1/m[0] mod 2^31.
193  *
194  * Factors pa, pb, qa and qb must be at most 2^31 in absolute value.
195  * Source integers a and b must be nonnegative; top word is not allowed
196  * to contain an extra 32th bit.
197  */
198 static void
199 co_reduce_mod(uint32_t *a, uint32_t *b, size_t len,
200         int64_t pa, int64_t pb, int64_t qa, int64_t qb,
201         const uint32_t *m, uint32_t m0i)
202 {
203         size_t k;
204         int64_t cca, ccb;
205         uint32_t fa, fb;
206
207         cca = 0;
208         ccb = 0;
209         fa = ((a[0] * (uint32_t)pa + b[0] * (uint32_t)pb) * m0i) & 0x7FFFFFFF;
210         fb = ((a[0] * (uint32_t)qa + b[0] * (uint32_t)qb) * m0i) & 0x7FFFFFFF;
211         for (k = 0; k < len; k ++) {
212                 uint32_t wa, wb;
213                 uint64_t za, zb;
214                 uint64_t tta, ttb;
215
216                 /*
217                  * In this loop, carries 'cca' and 'ccb' always fit on
218                  * 33 bits (in absolute value).
219                  */
220                 wa = a[k];
221                 wb = b[k];
222                 za = wa * (uint64_t)pa + wb * (uint64_t)pb
223                         + m[k] * (uint64_t)fa + (uint64_t)cca;
224                 zb = wa * (uint64_t)qa + wb * (uint64_t)qb
225                         + m[k] * (uint64_t)fb + (uint64_t)ccb;
226                 if (k > 0) {
227                         a[k - 1] = (uint32_t)za & 0x7FFFFFFF;
228                         b[k - 1] = (uint32_t)zb & 0x7FFFFFFF;
229                 }
230
231 #define M   ((uint64_t)1 << 32)
232                 tta = za >> 31;
233                 ttb = zb >> 31;
234                 tta = (tta ^ M) - M;
235                 ttb = (ttb ^ M) - M;
236                 cca = *(int64_t *)&tta;
237                 ccb = *(int64_t *)&ttb;
238 #undef M
239         }
240         a[len - 1] = (uint32_t)cca;
241         b[len - 1] = (uint32_t)ccb;
242
243         /*
244          * At this point:
245          *   -m <= a < 2*m
246          *   -m <= b < 2*m
247          * (this is a case of Montgomery reduction)
248          * The top word of 'a' and 'b' may have a 32-th bit set.
249          * We may have to add or subtract the modulus.
250          */
251         finish_mod(a, len, m, (uint32_t)((uint64_t)cca >> 63));
252         finish_mod(b, len, m, (uint32_t)((uint64_t)ccb >> 63));
253 }
254
255 /* see inner.h */
256 uint32_t
257 br_i31_moddiv(uint32_t *x, const uint32_t *y, const uint32_t *m, uint32_t m0i,
258         uint32_t *t)
259 {
260         /*
261          * Algorithm is an extended binary GCD. We maintain four values
262          * a, b, u and v, with the following invariants:
263          *
264          *   a * x = y * u mod m
265          *   b * x = y * v mod m
266          *
267          * Starting values are:
268          *
269          *   a = y
270          *   b = m
271          *   u = x
272          *   v = 0
273          *
274          * The formal definition of the algorithm is a sequence of steps:
275          *
276          *   - If a is even, then a <- a/2 and u <- u/2 mod m.
277          *   - Otherwise, if b is even, then b <- b/2 and v <- v/2 mod m.
278          *   - Otherwise, if a > b, then a <- (a-b)/2 and u <- (u-v)/2 mod m.
279          *   - Otherwise, b <- (b-a)/2 and v <- (v-u)/2 mod m.
280          *
281          * Algorithm stops when a = b. At that point, they both are equal
282          * to GCD(y,m); the modular division succeeds if that value is 1.
283          * The result of the modular division is then u (or v: both are
284          * equal at that point).
285          *
286          * Each step makes either a or b shrink by at least one bit; hence,
287          * if m has bit length k bits, then 2k-2 steps are sufficient.
288          *
289          *
290          * Though complexity is quadratic in the size of m, the bit-by-bit
291          * processing is not very efficient. We can speed up processing by
292          * remarking that the decisions are taken based only on observation
293          * of the top and low bits of a and b.
294          *
295          * In the loop below, at each iteration, we use the two top words
296          * of a and b, and the low words of a and b, to compute reduction
297          * parameters pa, pb, qa and qb such that the new values for a
298          * and b are:
299          *
300          *   a' = (a*pa + b*pb) / (2^31)
301          *   b' = (a*qa + b*qb) / (2^31)
302          *
303          * the division being exact.
304          *
305          * Since the choices are based on the top words, they may be slightly
306          * off, requiring an optional correction: if a' < 0, then we replace
307          * pa with -pa, and pb with -pb. The total length of a and b is
308          * thus reduced by at least 30 bits at each iteration.
309          *
310          * The stopping conditions are still the same, though: when a
311          * and b become equal, they must be both odd (since m is odd,
312          * the GCD cannot be even), therefore the next operation is a
313          * subtraction, and one of the values becomes 0. At that point,
314          * nothing else happens, i.e. one value is stuck at 0, and the
315          * other one is the GCD.
316          */
317         size_t len, k;
318         uint32_t *a, *b, *u, *v;
319         uint32_t num, r;
320
321         len = (m[0] + 31) >> 5;
322         a = t;
323         b = a + len;
324         u = x + 1;
325         v = b + len;
326         memcpy(a, y + 1, len * sizeof *y);
327         memcpy(b, m + 1, len * sizeof *m);
328         memset(v, 0, len * sizeof *v);
329
330         /*
331          * Loop below ensures that a and b are reduced by some bits each,
332          * for a total of at least 30 bits.
333          */
334         for (num = ((m[0] - (m[0] >> 5)) << 1) + 30; num >= 30; num -= 30) {
335                 size_t j;
336                 uint32_t c0, c1;
337                 uint32_t a0, a1, b0, b1;
338                 uint64_t a_hi, b_hi;
339                 uint32_t a_lo, b_lo;
340                 int64_t pa, pb, qa, qb;
341                 int i;
342
343                 /*
344                  * Extract top words of a and b. If j is the highest
345                  * index >= 1 such that a[j] != 0 or b[j] != 0, then we want
346                  * (a[j] << 31) + a[j - 1], and (b[j] << 31) + b[j - 1].
347                  * If a and b are down to one word each, then we use a[0]
348                  * and b[0].
349                  */
350                 c0 = (uint32_t)-1;
351                 c1 = (uint32_t)-1;
352                 a0 = 0;
353                 a1 = 0;
354                 b0 = 0;
355                 b1 = 0;
356                 j = len;
357                 while (j -- > 0) {
358                         uint32_t aw, bw;
359
360                         aw = a[j];
361                         bw = b[j];
362                         a0 ^= (a0 ^ aw) & c0;
363                         a1 ^= (a1 ^ aw) & c1;
364                         b0 ^= (b0 ^ bw) & c0;
365                         b1 ^= (b1 ^ bw) & c1;
366                         c1 = c0;
367                         c0 &= (((aw | bw) + 0x7FFFFFFF) >> 31) - (uint32_t)1;
368                 }
369
370                 /*
371                  * If c1 = 0, then we grabbed two words for a and b.
372                  * If c1 != 0 but c0 = 0, then we grabbed one word. It
373                  * is not possible that c1 != 0 and c0 != 0, because that
374                  * would mean that both integers are zero.
375                  */
376                 a1 |= a0 & c1;
377                 a0 &= ~c1;
378                 b1 |= b0 & c1;
379                 b0 &= ~c1;
380                 a_hi = ((uint64_t)a0 << 31) + a1;
381                 b_hi = ((uint64_t)b0 << 31) + b1;
382                 a_lo = a[0];
383                 b_lo = b[0];
384
385                 /*
386                  * Compute reduction factors:
387                  *
388                  *   a' = a*pa + b*pb
389                  *   b' = a*qa + b*qb
390                  *
391                  * such that a' and b' are both multiple of 2^31, but are
392                  * only marginally larger than a and b.
393                  */
394                 pa = 1;
395                 pb = 0;
396                 qa = 0;
397                 qb = 1;
398                 for (i = 0; i < 31; i ++) {
399                         /*
400                          * At each iteration:
401                          *
402                          *   a <- (a-b)/2 if: a is odd, b is odd, a_hi > b_hi
403                          *   b <- (b-a)/2 if: a is odd, b is odd, a_hi <= b_hi
404                          *   a <- a/2 if: a is even
405                          *   b <- b/2 if: a is odd, b is even
406                          *
407                          * We multiply a_lo and b_lo by 2 at each
408                          * iteration, thus a division by 2 really is a
409                          * non-multiplication by 2.
410                          */
411                         uint32_t r, oa, ob, cAB, cBA, cA;
412                         uint64_t rz;
413
414                         /*
415                          * r = GT(a_hi, b_hi)
416                          * But the GT() function works on uint32_t operands,
417                          * so we inline a 64-bit version here.
418                          */
419                         rz = b_hi - a_hi;
420                         r = (uint32_t)((rz ^ ((a_hi ^ b_hi)
421                                 & (a_hi ^ rz))) >> 63);
422
423                         /*
424                          * cAB = 1 if b must be subtracted from a
425                          * cBA = 1 if a must be subtracted from b
426                          * cA = 1 if a is divided by 2, 0 otherwise
427                          *
428                          * Rules:
429                          *
430                          *   cAB and cBA cannot be both 1.
431                          *   if a is not divided by 2, b is.
432                          */
433                         oa = (a_lo >> i) & 1;
434                         ob = (b_lo >> i) & 1;
435                         cAB = oa & ob & r;
436                         cBA = oa & ob & NOT(r);
437                         cA = cAB | NOT(oa);
438
439                         /*
440                          * Conditional subtractions.
441                          */
442                         a_lo -= b_lo & -cAB;
443                         a_hi -= b_hi & -(uint64_t)cAB;
444                         pa -= qa & -(int64_t)cAB;
445                         pb -= qb & -(int64_t)cAB;
446                         b_lo -= a_lo & -cBA;
447                         b_hi -= a_hi & -(uint64_t)cBA;
448                         qa -= pa & -(int64_t)cBA;
449                         qb -= pb & -(int64_t)cBA;
450
451                         /*
452                          * Shifting.
453                          */
454                         a_lo += a_lo & (cA - 1);
455                         pa += pa & ((int64_t)cA - 1);
456                         pb += pb & ((int64_t)cA - 1);
457                         a_hi ^= (a_hi ^ (a_hi >> 1)) & -(uint64_t)cA;
458                         b_lo += b_lo & -cA;
459                         qa += qa & -(int64_t)cA;
460                         qb += qb & -(int64_t)cA;
461                         b_hi ^= (b_hi ^ (b_hi >> 1)) & ((uint64_t)cA - 1);
462                 }
463
464                 /*
465                  * Replace a and b with new values a' and b'.
466                  */
467                 r = co_reduce(a, b, len, pa, pb, qa, qb);
468                 pa -= pa * ((r & 1) << 1);
469                 pb -= pb * ((r & 1) << 1);
470                 qa -= qa * (r & 2);
471                 qb -= qb * (r & 2);
472                 co_reduce_mod(u, v, len, pa, pb, qa, qb, m + 1, m0i);
473         }
474
475         /*
476          * Now one of the arrays should be 0, and the other contains
477          * the GCD. If a is 0, then u is 0 as well, and v contains
478          * the division result.
479          * Result is correct if and only if GCD is 1.
480          */
481         r = (a[0] | b[0]) ^ 1;
482         u[0] |= v[0];
483         for (k = 1; k < len; k ++) {
484                 r |= a[k] | b[k];
485                 u[k] |= v[k];
486         }
487         return EQ0(r);
488 }