summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bn/bn_word.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/bn/bn_word.c')
-rw-r--r--src/lib/libcrypto/bn/bn_word.c67
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
90BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w) 86BN_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