diff options
Diffstat (limited to 'src/lib/libcrypto/bn/bn_word.c')
-rw-r--r-- | src/lib/libcrypto/bn/bn_word.c | 67 |
1 files changed, 14 insertions, 53 deletions
diff --git a/src/lib/libcrypto/bn/bn_word.c b/src/lib/libcrypto/bn/bn_word.c index ee7b87c45c..de610ce54c 100644 --- a/src/lib/libcrypto/bn/bn_word.c +++ b/src/lib/libcrypto/bn/bn_word.c | |||
@@ -69,10 +69,6 @@ BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w) | |||
69 | #endif | 69 | #endif |
70 | int i; | 70 | int i; |
71 | 71 | ||
72 | if (w == 0) | ||
73 | return (BN_ULONG)-1; | ||
74 | |||
75 | bn_check_top(a); | ||
76 | w&=BN_MASK2; | 72 | w&=BN_MASK2; |
77 | for (i=a->top-1; i>=0; i--) | 73 | for (i=a->top-1; i>=0; i--) |
78 | { | 74 | { |
@@ -89,24 +85,12 @@ BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w) | |||
89 | 85 | ||
90 | BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w) | 86 | BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w) |
91 | { | 87 | { |
92 | BN_ULONG ret = 0; | 88 | BN_ULONG ret; |
93 | int i, j; | 89 | int i; |
94 | |||
95 | bn_check_top(a); | ||
96 | w &= BN_MASK2; | ||
97 | |||
98 | if (!w) | ||
99 | /* actually this an error (division by zero) */ | ||
100 | return (BN_ULONG)-1; | ||
101 | if (a->top == 0) | ||
102 | return 0; | ||
103 | |||
104 | /* normalize input (so bn_div_words doesn't complain) */ | ||
105 | j = BN_BITS2 - BN_num_bits_word(w); | ||
106 | w <<= j; | ||
107 | if (!BN_lshift(a, a, j)) | ||
108 | return (BN_ULONG)-1; | ||
109 | 90 | ||
91 | if (a->top == 0) return(0); | ||
92 | ret=0; | ||
93 | w&=BN_MASK2; | ||
110 | for (i=a->top-1; i>=0; i--) | 94 | for (i=a->top-1; i>=0; i--) |
111 | { | 95 | { |
112 | BN_ULONG l,d; | 96 | BN_ULONG l,d; |
@@ -118,8 +102,6 @@ BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w) | |||
118 | } | 102 | } |
119 | if ((a->top > 0) && (a->d[a->top-1] == 0)) | 103 | if ((a->top > 0) && (a->d[a->top-1] == 0)) |
120 | a->top--; | 104 | a->top--; |
121 | ret >>= j; | ||
122 | bn_check_top(a); | ||
123 | return(ret); | 105 | return(ret); |
124 | } | 106 | } |
125 | 107 | ||
@@ -128,14 +110,9 @@ int BN_add_word(BIGNUM *a, BN_ULONG w) | |||
128 | BN_ULONG l; | 110 | BN_ULONG l; |
129 | int i; | 111 | int i; |
130 | 112 | ||
131 | bn_check_top(a); | 113 | if ((w & BN_MASK2) == 0) |
132 | w &= BN_MASK2; | 114 | return(1); |
133 | 115 | ||
134 | /* degenerate case: w is zero */ | ||
135 | if (!w) return 1; | ||
136 | /* degenerate case: a is zero */ | ||
137 | if(BN_is_zero(a)) return BN_set_word(a, w); | ||
138 | /* handle 'a' when negative */ | ||
139 | if (a->neg) | 116 | if (a->neg) |
140 | { | 117 | { |
141 | a->neg=0; | 118 | a->neg=0; |
@@ -144,17 +121,15 @@ int BN_add_word(BIGNUM *a, BN_ULONG w) | |||
144 | a->neg=!(a->neg); | 121 | a->neg=!(a->neg); |
145 | return(i); | 122 | return(i); |
146 | } | 123 | } |
147 | /* Only expand (and risk failing) if it's possibly necessary */ | 124 | w&=BN_MASK2; |
148 | if (((BN_ULONG)(a->d[a->top - 1] + 1) == 0) && | 125 | if (bn_wexpand(a,a->top+1) == NULL) return(0); |
149 | (bn_wexpand(a,a->top+1) == NULL)) | ||
150 | return(0); | ||
151 | i=0; | 126 | i=0; |
152 | for (;;) | 127 | for (;;) |
153 | { | 128 | { |
154 | if (i >= a->top) | 129 | if (i >= a->top) |
155 | l=w; | 130 | l=w; |
156 | else | 131 | else |
157 | l=(a->d[i]+w)&BN_MASK2; | 132 | l=(a->d[i]+(BN_ULONG)w)&BN_MASK2; |
158 | a->d[i]=l; | 133 | a->d[i]=l; |
159 | if (w > l) | 134 | if (w > l) |
160 | w=1; | 135 | w=1; |
@@ -164,7 +139,6 @@ int BN_add_word(BIGNUM *a, BN_ULONG w) | |||
164 | } | 139 | } |
165 | if (i >= a->top) | 140 | if (i >= a->top) |
166 | a->top++; | 141 | a->top++; |
167 | bn_check_top(a); | ||
168 | return(1); | 142 | return(1); |
169 | } | 143 | } |
170 | 144 | ||
@@ -172,21 +146,10 @@ int BN_sub_word(BIGNUM *a, BN_ULONG w) | |||
172 | { | 146 | { |
173 | int i; | 147 | int i; |
174 | 148 | ||
175 | bn_check_top(a); | 149 | if ((w & BN_MASK2) == 0) |
176 | w &= BN_MASK2; | 150 | return(1); |
177 | 151 | ||
178 | /* degenerate case: w is zero */ | 152 | if (BN_is_zero(a) || a->neg) |
179 | if (!w) return 1; | ||
180 | /* degenerate case: a is zero */ | ||
181 | if(BN_is_zero(a)) | ||
182 | { | ||
183 | i = BN_set_word(a,w); | ||
184 | if (i != 0) | ||
185 | BN_set_negative(a, 1); | ||
186 | return i; | ||
187 | } | ||
188 | /* handle 'a' when negative */ | ||
189 | if (a->neg) | ||
190 | { | 153 | { |
191 | a->neg=0; | 154 | a->neg=0; |
192 | i=BN_add_word(a,w); | 155 | i=BN_add_word(a,w); |
@@ -194,6 +157,7 @@ int BN_sub_word(BIGNUM *a, BN_ULONG w) | |||
194 | return(i); | 157 | return(i); |
195 | } | 158 | } |
196 | 159 | ||
160 | w&=BN_MASK2; | ||
197 | if ((a->top == 1) && (a->d[0] < w)) | 161 | if ((a->top == 1) && (a->d[0] < w)) |
198 | { | 162 | { |
199 | a->d[0]=w-a->d[0]; | 163 | a->d[0]=w-a->d[0]; |
@@ -217,7 +181,6 @@ int BN_sub_word(BIGNUM *a, BN_ULONG w) | |||
217 | } | 181 | } |
218 | if ((a->d[i] == 0) && (i == (a->top-1))) | 182 | if ((a->d[i] == 0) && (i == (a->top-1))) |
219 | a->top--; | 183 | a->top--; |
220 | bn_check_top(a); | ||
221 | return(1); | 184 | return(1); |
222 | } | 185 | } |
223 | 186 | ||
@@ -225,7 +188,6 @@ int BN_mul_word(BIGNUM *a, BN_ULONG w) | |||
225 | { | 188 | { |
226 | BN_ULONG ll; | 189 | BN_ULONG ll; |
227 | 190 | ||
228 | bn_check_top(a); | ||
229 | w&=BN_MASK2; | 191 | w&=BN_MASK2; |
230 | if (a->top) | 192 | if (a->top) |
231 | { | 193 | { |
@@ -241,7 +203,6 @@ int BN_mul_word(BIGNUM *a, BN_ULONG w) | |||
241 | } | 203 | } |
242 | } | 204 | } |
243 | } | 205 | } |
244 | bn_check_top(a); | ||
245 | return(1); | 206 | return(1); |
246 | } | 207 | } |
247 | 208 | ||