1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <tommath.h> 2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef BN_MP_MUL_2D_C 3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomMath, multiple-precision integer library -- Tom St Denis 4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomMath is a library that provides multiple-precision 6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * integer arithmetic as well as number theoretic functionality. 7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library was designed directly after the MPI library by 9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Michael Fromberger but has been written from scratch with 10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * additional optimizations in place. 11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express 13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works. 14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://math.libtomcrypt.com 16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* shift left by a certain bit count */ 19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint mp_mul_2d (mp_int * a, int b, mp_int * c) 20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_digit d; 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int res; 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* copy */ 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (a != c) { 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((res = mp_copy (a, c)) != MP_OKAY) { 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return res; 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (c->alloc < (int)(c->used + b/DIGIT_BIT + 1)) { 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) { 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return res; 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* shift by as many digits in the bit count */ 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (b >= (int)DIGIT_BIT) { 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return res; 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* shift any bit count < DIGIT_BIT */ 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project d = (mp_digit) (b % DIGIT_BIT); 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (d != 0) { 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register mp_digit *tmpc, shift, mask, r, rr; 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register int x; 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* bitmask for carries */ 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mask = (((mp_digit)1) << d) - 1; 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* shift for msbs */ 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project shift = DIGIT_BIT - d; 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* alias */ 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project tmpc = c->dp; 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* carry */ 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project r = 0; 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < c->used; x++) { 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* get the higher bits of the current word */ 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project rr = (*tmpc >> shift) & mask; 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* shift the current word and OR in the carry */ 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *tmpc = ((*tmpc << d) | r) & MP_MASK; 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ++tmpc; 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* set the carry to the carry bits of the current word */ 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project r = rr; 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* set final carry */ 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (r != 0) { 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project c->dp[(c->used)++] = r; 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clamp (c); 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return MP_OKAY; 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtommath/bn_mp_mul_2d.c,v $ */ 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.3 $ */ 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/03/31 14:18:44 $ */ 86