LCOV - code coverage report
Current view: top level - third_party/heimdal/lib/hcrypto/libtommath - bn_s_mp_add.c (source / functions) Hit Total Coverage
Test: coverage report for master 98b443d9 Lines: 34 35 97.1 %
Date: 2024-05-31 13:13:24 Functions: 1 1 100.0 %

          Line data    Source code
       1             : #include "tommath_private.h"
       2             : #ifdef BN_S_MP_ADD_C
       3             : /* LibTomMath, multiple-precision integer library -- Tom St Denis */
       4             : /* SPDX-License-Identifier: Unlicense */
       5             : 
       6             : /* low level addition, based on HAC pp.594, Algorithm 14.7 */
       7      350355 : mp_err s_mp_add(const mp_int *a, const mp_int *b, mp_int *c)
       8             : {
       9       22536 :    const mp_int *x;
      10       22536 :    mp_err err;
      11       22536 :    int     olduse, min, max;
      12             : 
      13             :    /* find sizes, we let |a| <= |b| which means we have to sort
      14             :     * them.  "x" will point to the input with the most digits
      15             :     */
      16      350355 :    if (a->used > b->used) {
      17        5052 :       min = b->used;
      18        5052 :       max = a->used;
      19        5052 :       x = a;
      20             :    } else {
      21      345295 :       min = a->used;
      22      345295 :       max = b->used;
      23      345295 :       x = b;
      24             :    }
      25             : 
      26             :    /* init result */
      27      350355 :    if (c->alloc < (max + 1)) {
      28        4029 :       if ((err = mp_grow(c, max + 1)) != MP_OKAY) {
      29           0 :          return err;
      30             :       }
      31             :    }
      32             : 
      33             :    /* get old used digit count and set new one */
      34      350355 :    olduse = c->used;
      35      350355 :    c->used = max + 1;
      36             : 
      37             :    {
      38       22536 :       mp_digit u, *tmpa, *tmpb, *tmpc;
      39       22536 :       int i;
      40             : 
      41             :       /* alias for digit pointers */
      42             : 
      43             :       /* first input */
      44      350355 :       tmpa = a->dp;
      45             : 
      46             :       /* second input */
      47      350355 :       tmpb = b->dp;
      48             : 
      49             :       /* destination */
      50      350355 :       tmpc = c->dp;
      51             : 
      52             :       /* zero the carry */
      53      350355 :       u = 0;
      54    23582788 :       for (i = 0; i < min; i++) {
      55             :          /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */
      56    23232433 :          *tmpc = *tmpa++ + *tmpb++ + u;
      57             : 
      58             :          /* U = carry bit of T[i] */
      59    23232433 :          u = *tmpc >> (mp_digit)MP_DIGIT_BIT;
      60             : 
      61             :          /* take away carry bit from T[i] */
      62    23232433 :          *tmpc++ &= MP_MASK;
      63             :       }
      64             : 
      65             :       /* now copy higher words if any, that is in A+B
      66             :        * if A or B has more digits add those in
      67             :        */
      68      350355 :       if (min != max) {
      69      563836 :          for (; i < max; i++) {
      70             :             /* T[i] = X[i] + U */
      71      546813 :             *tmpc = x->dp[i] + u;
      72             : 
      73             :             /* U = carry bit of T[i] */
      74      546813 :             u = *tmpc >> (mp_digit)MP_DIGIT_BIT;
      75             : 
      76             :             /* take away carry bit from T[i] */
      77      546813 :             *tmpc++ &= MP_MASK;
      78             :          }
      79             :       }
      80             : 
      81             :       /* add carry */
      82      350355 :       *tmpc++ = u;
      83             : 
      84             :       /* clear digits above oldused */
      85      350355 :       MP_ZERO_DIGITS(tmpc, olduse - c->used);
      86             :    }
      87             : 
      88      350355 :    mp_clamp(c);
      89      350355 :    return MP_OKAY;
      90             : }
      91             : #endif

Generated by: LCOV version 1.14