3 /* LibTomMath, multiple-precision integer library -- Tom St Denis
5 * LibTomMath is a library that provides multiple-precision
6 * integer arithmetic as well as number theoretic functionality.
8 * The library was designed directly after the MPI library by
9 * Michael Fromberger but has been written from scratch with
10 * additional optimizations in place.
12 * The library is free for all purposes without any express
15 * Tom St Denis, tomstdenis@gmail.com, http://math.libtomcrypt.com
18 /* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */
19 int s_mp_sqr (mp_int
* a
, mp_int
* b
)
24 mp_digit u
, tmpx
, *tmpt
;
27 if ((res
= mp_init_size (&t
, 2*pa
+ 1)) != MP_OKAY
) {
31 /* default used is maximum possible size */
34 for (ix
= 0; ix
< pa
; ix
++) {
35 /* first calculate the digit at 2*ix */
36 /* calculate double precision result */
37 r
= ((mp_word
) t
.dp
[2*ix
]) +
38 ((mp_word
)a
->dp
[ix
])*((mp_word
)a
->dp
[ix
]);
40 /* store lower part in result */
41 t
.dp
[ix
+ix
] = (mp_digit
) (r
& ((mp_word
) MP_MASK
));
44 u
= (mp_digit
)(r
>> ((mp_word
) DIGIT_BIT
));
46 /* left hand side of A[ix] * A[iy] */
49 /* alias for where to store the results */
50 tmpt
= t
.dp
+ (2*ix
+ 1);
52 for (iy
= ix
+ 1; iy
< pa
; iy
++) {
53 /* first calculate the product */
54 r
= ((mp_word
)tmpx
) * ((mp_word
)a
->dp
[iy
]);
56 /* now calculate the double precision result, note we use
57 * addition instead of *2 since it's easier to optimize
59 r
= ((mp_word
) *tmpt
) + r
+ r
+ ((mp_word
) u
);
61 /* store lower part */
62 *tmpt
++ = (mp_digit
) (r
& ((mp_word
) MP_MASK
));
65 u
= (mp_digit
)(r
>> ((mp_word
) DIGIT_BIT
));
67 /* propagate upwards */
68 while (u
!= ((mp_digit
) 0)) {
69 r
= ((mp_word
) *tmpt
) + ((mp_word
) u
);
70 *tmpt
++ = (mp_digit
) (r
& ((mp_word
) MP_MASK
));
71 u
= (mp_digit
)(r
>> ((mp_word
) DIGIT_BIT
));
82 /* $Source: /cvs/libtom/libtommath/bn_s_mp_sqr.c,v $ */
83 /* $Revision: 1.3 $ */
84 /* $Date: 2006/03/31 14:18:44 $ */