1 | /* |
2 | Copyright (C) 1999-2007 The Botan Project. All rights reserved. |
3 | |
4 | Redistribution and use in source and binary forms, for any use, with or without |
5 | modification, is permitted provided that the following conditions are met: |
6 | |
7 | 1. Redistributions of source code must retain the above copyright notice, this |
8 | list of conditions, and the following disclaimer. |
9 | |
10 | 2. Redistributions in binary form must reproduce the above copyright notice, |
11 | this list of conditions, and the following disclaimer in the documentation |
12 | and/or other materials provided with the distribution. |
13 | |
14 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) "AS IS" AND ANY EXPRESS OR IMPLIED |
15 | WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
16 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. |
17 | |
18 | IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE FOR ANY DIRECT, |
19 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
20 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
21 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
22 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
23 | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
24 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
25 | */ |
26 | // LICENSEHEADER_END |
27 | namespace QCA { // WRAPNS_LINE |
28 | /************************************************* |
29 | * MP Shift Algorithms Source File * |
30 | * (C) 1999-2007 The Botan Project * |
31 | *************************************************/ |
32 | |
33 | } // WRAPNS_LINE |
34 | #include <botan/mp_core.h> |
35 | namespace QCA { // WRAPNS_LINE |
36 | } // WRAPNS_LINE |
37 | #include <botan/mem_ops.h> |
38 | namespace QCA { // WRAPNS_LINE |
39 | |
40 | namespace Botan { |
41 | |
42 | extern "C" { |
43 | |
44 | /************************************************* |
45 | * Single Operand Left Shift * |
46 | *************************************************/ |
47 | void bigint_shl1(word x[], u32bit x_size, u32bit word_shift, u32bit bit_shift) |
48 | { |
49 | if (word_shift) { |
50 | for (u32bit j = 1; j != x_size + 1; ++j) |
51 | x[(x_size - j) + word_shift] = x[x_size - j]; |
52 | clear_mem(ptr: x, n: word_shift); |
53 | } |
54 | |
55 | if (bit_shift) { |
56 | word carry = 0; |
57 | for (u32bit j = word_shift; j != x_size + word_shift + 1; ++j) { |
58 | word temp = x[j]; |
59 | x[j] = (temp << bit_shift) | carry; |
60 | carry = (temp >> (MP_WORD_BITS - bit_shift)); |
61 | } |
62 | } |
63 | } |
64 | |
65 | /************************************************* |
66 | * Single Operand Right Shift * |
67 | *************************************************/ |
68 | void bigint_shr1(word x[], u32bit x_size, u32bit word_shift, u32bit bit_shift) |
69 | { |
70 | if (x_size < word_shift) { |
71 | clear_mem(ptr: x, n: x_size); |
72 | return; |
73 | } |
74 | |
75 | if (word_shift) { |
76 | for (u32bit j = 0; j != x_size - word_shift; ++j) |
77 | x[j] = x[j + word_shift]; |
78 | for (u32bit j = x_size - word_shift; j != x_size; ++j) |
79 | x[j] = 0; |
80 | } |
81 | |
82 | if (bit_shift) { |
83 | word carry = 0; |
84 | for (u32bit j = x_size - word_shift; j > 0; --j) { |
85 | word temp = x[j - 1]; |
86 | x[j - 1] = (temp >> bit_shift) | carry; |
87 | carry = (temp << (MP_WORD_BITS - bit_shift)); |
88 | } |
89 | } |
90 | } |
91 | |
92 | /************************************************* |
93 | * Two Operand Left Shift * |
94 | *************************************************/ |
95 | void bigint_shl2(word y[], const word x[], u32bit x_size, u32bit word_shift, u32bit bit_shift) |
96 | { |
97 | for (u32bit j = 0; j != x_size; ++j) |
98 | y[j + word_shift] = x[j]; |
99 | if (bit_shift) { |
100 | word carry = 0; |
101 | for (u32bit j = word_shift; j != x_size + word_shift + 1; ++j) { |
102 | word temp = y[j]; |
103 | y[j] = (temp << bit_shift) | carry; |
104 | carry = (temp >> (MP_WORD_BITS - bit_shift)); |
105 | } |
106 | } |
107 | } |
108 | |
109 | /************************************************* |
110 | * Two Operand Right Shift * |
111 | *************************************************/ |
112 | void bigint_shr2(word y[], const word x[], u32bit x_size, u32bit word_shift, u32bit bit_shift) |
113 | { |
114 | if (x_size < word_shift) |
115 | return; |
116 | |
117 | for (u32bit j = 0; j != x_size - word_shift; ++j) |
118 | y[j] = x[j + word_shift]; |
119 | if (bit_shift) { |
120 | word carry = 0; |
121 | for (u32bit j = x_size - word_shift; j > 0; --j) { |
122 | word temp = y[j - 1]; |
123 | y[j - 1] = (temp >> bit_shift) | carry; |
124 | carry = (temp << (MP_WORD_BITS - bit_shift)); |
125 | } |
126 | } |
127 | } |
128 | } |
129 | |
130 | } |
131 | } // WRAPNS_LINE |
132 | |