LCOV - code coverage report
Current view: top level - third_party/heimdal/lib/hcrypto/libtommath - bn_mp_mul_2.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 20 22 90.9 %
Date: 2024-04-21 15:09:00 Functions: 1 1 100.0 %

          Line data    Source code
       1             : #include "tommath_private.h"
       2             : #ifdef BN_MP_MUL_2_C
       3             : /* LibTomMath, multiple-precision integer library -- Tom St Denis */
       4             : /* SPDX-License-Identifier: Unlicense */
       5             : 
       6             : /* b = a*2 */
       7       44886 : mp_err mp_mul_2(const mp_int *a, mp_int *b)
       8             : {
       9        1568 :    int     x, oldused;
      10        1568 :    mp_err err;
      11             : 
      12             :    /* grow to accomodate result */
      13       44886 :    if (b->alloc < (a->used + 1)) {
      14           0 :       if ((err = mp_grow(b, a->used + 1)) != MP_OKAY) {
      15           0 :          return err;
      16             :       }
      17             :    }
      18             : 
      19       44886 :    oldused = b->used;
      20       44886 :    b->used = a->used;
      21             : 
      22             :    {
      23        1568 :       mp_digit r, rr, *tmpa, *tmpb;
      24             : 
      25             :       /* alias for source */
      26       44886 :       tmpa = a->dp;
      27             : 
      28             :       /* alias for dest */
      29       44886 :       tmpb = b->dp;
      30             : 
      31             :       /* carry */
      32       44886 :       r = 0;
      33     2069858 :       for (x = 0; x < a->used; x++) {
      34             : 
      35             :          /* get what will be the *next* carry bit from the
      36             :           * MSB of the current digit
      37             :           */
      38     2024972 :          rr = *tmpa >> (mp_digit)(MP_DIGIT_BIT - 1);
      39             : 
      40             :          /* now shift up this digit, add in the carry [from the previous] */
      41     2024972 :          *tmpb++ = ((*tmpa++ << 1uL) | r) & MP_MASK;
      42             : 
      43             :          /* copy the carry that would be from the source
      44             :           * digit into the next iteration
      45             :           */
      46     2024972 :          r = rr;
      47             :       }
      48             : 
      49             :       /* new leading digit? */
      50       44886 :       if (r != 0u) {
      51             :          /* add a MSB which is always 1 at this point */
      52         414 :          *tmpb = 1;
      53         414 :          ++(b->used);
      54             :       }
      55             : 
      56             :       /* now zero any excess digits on the destination
      57             :        * that we didn't write to
      58             :        */
      59       44886 :       MP_ZERO_DIGITS(b->dp + b->used, oldused - b->used);
      60             :    }
      61       44886 :    b->sign = a->sign;
      62       44886 :    return MP_OKAY;
      63             : }
      64             : #endif

Generated by: LCOV version 1.14