pb = MP_DIGITS(b);
mp_err   mp_mul(const mp_int *a, const mp_int *b, mp_int * c){  mp_digit *pb = MP_DIGITS(b);  mp_int   tmp;  mp_err   res;  mp_size  ib;  ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG);  if (a == c) {    if ((res = mp_init_copy(&tmp, a)) != MP_OKAY)      return res;    if (a == b)       b = &tmp;    a = &tmp;  } else if (b == c) {    if ((res = mp_init_copy(&tmp, b)) != MP_OKAY)      return res;    b = &tmp;  } else {    MP_DIGITS(&tmp) = 0;  }  /* This has the effect of left-padding with zeroes... */  MP_USED(c) = 1; MP_DIGIT(c, 0) = 0;  if((res = s_mp_pad(c, USED(a) + USED(b))) != MP_OKAY)    goto CLEANUP;  /* Outer loop:  Digits of b */  for(ib = 0; ib < USED(b); ib++) {    mp_digit b_i    = *pb++;    if(b_i == 0)      continue;    /* Inner product:  Digits of a */    s_mp_mul_d_add_offset(a, b_i, c, ib);  }  s_mp_clamp(c);  if(SIGN(a) == SIGN(b) || s_mp_cmp_d(c, 0) == MP_EQ)    SIGN(c) = ZPOS;  else    SIGN(c) = NEG;CLEANUP:  mp_clear(&tmp);  return res;} /* end mp_mul() */