1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <tommath.h>
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef BN_MP_SQR_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/* computes b = a*a */
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectmp_sqr (mp_int * a, mp_int * b)
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  int     res;
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef BN_MP_TOOM_SQR_C
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* use Toom-Cook? */
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  if (a->used >= TOOM_SQR_CUTOFF) {
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    res = mp_toom_sqr(a, b);
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  /* Karatsuba? */
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  } else
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef BN_MP_KARATSUBA_SQR_C
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectif (a->used >= KARATSUBA_SQR_CUTOFF) {
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    res = mp_karatsuba_sqr (a, b);
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  } else
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  {
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef BN_FAST_S_MP_SQR_C
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* can we use the fast comba multiplier? */
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if ((a->used * 2 + 1) < MP_WARRAY &&
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         a->used <
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project         (1 << (sizeof(mp_word) * CHAR_BIT - 2*DIGIT_BIT - 1))) {
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      res = fast_s_mp_sqr (a, b);
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    } else
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef BN_S_MP_SQR_C
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      res = s_mp_sqr (a, b);
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      res = MP_VAL;
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  }
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  b->sign = MP_ZPOS;
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  return res;
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtommath/bn_mp_sqr.c,v $ */
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.3 $ */
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/03/31 14:18:44 $ */
59