LCOV - code coverage report
Current view: top level - third_party/heimdal/lib/hcrypto/libtommath - bn_mp_mul_d.c (source / functions) Hit Total Coverage
Test: coverage report for master 70ed9daf Lines: 22 23 95.7 %
Date: 2024-01-11 09:59:51 Functions: 1 1 100.0 %

          Line data    Source code
       1             : #include "tommath_private.h"
       2             : #ifdef BN_MP_MUL_D_C
       3             : /* LibTomMath, multiple-precision integer library -- Tom St Denis */
       4             : /* SPDX-License-Identifier: Unlicense */
       5             : 
       6             : /* multiply by a digit */
       7      186230 : mp_err mp_mul_d(const mp_int *a, mp_digit b, mp_int *c)
       8             : {
       9        9673 :    mp_digit u, *tmpa, *tmpc;
      10        9673 :    mp_word  r;
      11        9673 :    mp_err   err;
      12        9673 :    int      ix, olduse;
      13             : 
      14             :    /* make sure c is big enough to hold a*b */
      15      186230 :    if (c->alloc < (a->used + 1)) {
      16        1193 :       if ((err = mp_grow(c, a->used + 1)) != MP_OKAY) {
      17           0 :          return err;
      18             :       }
      19             :    }
      20             : 
      21             :    /* get the original destinations used count */
      22      186230 :    olduse = c->used;
      23             : 
      24             :    /* set the sign */
      25      186230 :    c->sign = a->sign;
      26             : 
      27             :    /* alias for a->dp [source] */
      28      186230 :    tmpa = a->dp;
      29             : 
      30             :    /* alias for c->dp [dest] */
      31      186230 :    tmpc = c->dp;
      32             : 
      33             :    /* zero carry */
      34      186230 :    u = 0;
      35             : 
      36             :    /* compute columns */
      37     5657051 :    for (ix = 0; ix < a->used; ix++) {
      38             :       /* compute product and carry sum for this term */
      39     5470821 :       r       = (mp_word)u + ((mp_word)*tmpa++ * (mp_word)b);
      40             : 
      41             :       /* mask off higher bits to get a single digit */
      42     5470821 :       *tmpc++ = (mp_digit)(r & (mp_word)MP_MASK);
      43             : 
      44             :       /* send carry into next iteration */
      45     5470821 :       u       = (mp_digit)(r >> (mp_word)MP_DIGIT_BIT);
      46             :    }
      47             : 
      48             :    /* store final carry [if any] and increment ix offset  */
      49      186230 :    *tmpc++ = u;
      50      186230 :    ++ix;
      51             : 
      52             :    /* now zero digits above the top */
      53      186230 :    MP_ZERO_DIGITS(tmpc, olduse - ix);
      54             : 
      55             :    /* set used count */
      56      186230 :    c->used = a->used + 1;
      57      186230 :    mp_clamp(c);
      58             : 
      59      186230 :    return MP_OKAY;
      60             : }
      61             : #endif

Generated by: LCOV version 1.14