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 v4-17-test 1498b464 Lines: 18 19 94.7 %
Date: 2024-06-13 04:01:37 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       44034 : mp_err mp_mul_d(const mp_int *a, mp_digit b, mp_int *c)
       8             : {
       9             :    mp_digit u, *tmpa, *tmpc;
      10             :    mp_word  r;
      11             :    mp_err   err;
      12             :    int      ix, olduse;
      13             : 
      14             :    /* make sure c is big enough to hold a*b */
      15       44034 :    if (c->alloc < (a->used + 1)) {
      16         342 :       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       44034 :    olduse = c->used;
      23             : 
      24             :    /* set the sign */
      25       44034 :    c->sign = a->sign;
      26             : 
      27             :    /* alias for a->dp [source] */
      28       44034 :    tmpa = a->dp;
      29             : 
      30             :    /* alias for c->dp [dest] */
      31       44034 :    tmpc = c->dp;
      32             : 
      33             :    /* zero carry */
      34       44034 :    u = 0;
      35             : 
      36             :    /* compute columns */
      37     1051405 :    for (ix = 0; ix < a->used; ix++) {
      38             :       /* compute product and carry sum for this term */
      39     1007371 :       r       = (mp_word)u + ((mp_word)*tmpa++ * (mp_word)b);
      40             : 
      41             :       /* mask off higher bits to get a single digit */
      42     1007371 :       *tmpc++ = (mp_digit)(r & (mp_word)MP_MASK);
      43             : 
      44             :       /* send carry into next iteration */
      45     1007371 :       u       = (mp_digit)(r >> (mp_word)MP_DIGIT_BIT);
      46             :    }
      47             : 
      48             :    /* store final carry [if any] and increment ix offset  */
      49       44034 :    *tmpc++ = u;
      50       44034 :    ++ix;
      51             : 
      52             :    /* now zero digits above the top */
      53       44034 :    MP_ZERO_DIGITS(tmpc, olduse - ix);
      54             : 
      55             :    /* set used count */
      56       44034 :    c->used = a->used + 1;
      57       44034 :    mp_clamp(c);
      58             : 
      59       44034 :    return MP_OKAY;
      60             : }
      61             : #endif

Generated by: LCOV version 1.13