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 v4-17-test 1498b464 Lines: 17 19 89.5 %
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_2_C
       3             : /* LibTomMath, multiple-precision integer library -- Tom St Denis */
       4             : /* SPDX-License-Identifier: Unlicense */
       5             : 
       6             : /* b = a*2 */
       7       11837 : mp_err mp_mul_2(const mp_int *a, mp_int *b)
       8             : {
       9             :    int     x, oldused;
      10             :    mp_err err;
      11             : 
      12             :    /* grow to accomodate result */
      13       11837 :    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       11837 :    oldused = b->used;
      20       11837 :    b->used = a->used;
      21             : 
      22             :    {
      23             :       mp_digit r, rr, *tmpa, *tmpb;
      24             : 
      25             :       /* alias for source */
      26       11837 :       tmpa = a->dp;
      27             : 
      28             :       /* alias for dest */
      29       11837 :       tmpb = b->dp;
      30             : 
      31             :       /* carry */
      32       11837 :       r = 0;
      33      463194 :       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      451357 :          rr = *tmpa >> (mp_digit)(MP_DIGIT_BIT - 1);
      39             : 
      40             :          /* now shift up this digit, add in the carry [from the previous] */
      41      451357 :          *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      451357 :          r = rr;
      47             :       }
      48             : 
      49             :       /* new leading digit? */
      50       11837 :       if (r != 0u) {
      51             :          /* add a MSB which is always 1 at this point */
      52         111 :          *tmpb = 1;
      53         111 :          ++(b->used);
      54             :       }
      55             : 
      56             :       /* now zero any excess digits on the destination
      57             :        * that we didn't write to
      58             :        */
      59       11837 :       MP_ZERO_DIGITS(b->dp + b->used, oldused - b->used);
      60             :    }
      61       11837 :    b->sign = a->sign;
      62       11837 :    return MP_OKAY;
      63             : }
      64             : #endif

Generated by: LCOV version 1.13