summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bn/bn_shift.c
diff options
context:
space:
mode:
authorjsing <>2014-05-08 13:20:49 +0000
committerjsing <>2014-05-08 13:20:49 +0000
commit2e8879604fe3abbc2431ca79a4a923f1e87da75e (patch)
tree18398455223278c0cb2bd44f57e4499a4370f665 /src/lib/libcrypto/bn/bn_shift.c
parentf7d9a959949e5f3918c1cf2b27fb4cd7b62d07d5 (diff)
downloadopenbsd-2e8879604fe3abbc2431ca79a4a923f1e87da75e.tar.gz
openbsd-2e8879604fe3abbc2431ca79a4a923f1e87da75e.tar.bz2
openbsd-2e8879604fe3abbc2431ca79a4a923f1e87da75e.zip
Emergency knfectomie requested by tedu@.
Diffstat (limited to 'src/lib/libcrypto/bn/bn_shift.c')
-rw-r--r--src/lib/libcrypto/bn/bn_shift.c248
1 files changed, 121 insertions, 127 deletions
diff --git a/src/lib/libcrypto/bn/bn_shift.c b/src/lib/libcrypto/bn/bn_shift.c
index a6fca2c424..870a059874 100644
--- a/src/lib/libcrypto/bn/bn_shift.c
+++ b/src/lib/libcrypto/bn/bn_shift.c
@@ -5,21 +5,21 @@
5 * This package is an SSL implementation written 5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com). 6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL. 7 * The implementation was written so as to conform with Netscapes SSL.
8 * 8 *
9 * This library is free for commercial and non-commercial use as long as 9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions 10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA, 11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms 13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 * 15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in 16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed. 17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution 18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used. 19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or 20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package. 21 * in documentation (online or textual) provided with the package.
22 * 22 *
23 * Redistribution and use in source and binary forms, with or without 23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions 24 * modification, are permitted provided that the following conditions
25 * are met: 25 * are met:
@@ -34,10 +34,10 @@
34 * Eric Young (eay@cryptsoft.com)" 34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library 35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-). 36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from 37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement: 38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 * 40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -49,7 +49,7 @@
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE. 51 * SUCH DAMAGE.
52 * 52 *
53 * The licence and distribution terms for any publically available version or 53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be 54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence 55 * copied and put under another distribution licence
@@ -60,164 +60,158 @@
60#include "cryptlib.h" 60#include "cryptlib.h"
61#include "bn_lcl.h" 61#include "bn_lcl.h"
62 62
63int BN_lshift1(BIGNUM *r, const BIGNUM *a) 63int
64 { 64BN_lshift1(BIGNUM *r, const BIGNUM *a)
65 register BN_ULONG *ap,*rp,t,c; 65{
66 register BN_ULONG *ap, *rp, t, c;
66 int i; 67 int i;
67 68
68 bn_check_top(r); 69 bn_check_top(r);
69 bn_check_top(a); 70 bn_check_top(a);
70 71
71 if (r != a) 72 if (r != a) {
72 { 73 r->neg = a->neg;
73 r->neg=a->neg; 74 if (bn_wexpand(r, a->top + 1) == NULL)
74 if (bn_wexpand(r,a->top+1) == NULL) return(0); 75 return (0);
75 r->top=a->top; 76 r->top = a->top;
76 } 77 } else {
77 else 78 if (bn_wexpand(r, a->top + 1) == NULL)
78 { 79 return (0);
79 if (bn_wexpand(r,a->top+1) == NULL) return(0); 80 }
80 } 81 ap = a->d;
81 ap=a->d; 82 rp = r->d;
82 rp=r->d; 83 c = 0;
83 c=0; 84 for (i = 0; i < a->top; i++) {
84 for (i=0; i<a->top; i++)
85 {
86 t= *(ap++); 85 t= *(ap++);
87 *(rp++)=((t<<1)|c)&BN_MASK2; 86 *(rp++) = ((t << 1) | c) & BN_MASK2;
88 c=(t & BN_TBIT)?1:0; 87 c = (t & BN_TBIT) ? 1 : 0;
89 } 88 }
90 if (c) 89 if (c) {
91 { 90 *rp = 1;
92 *rp=1;
93 r->top++; 91 r->top++;
94 }
95 bn_check_top(r);
96 return(1);
97 } 92 }
93 bn_check_top(r);
94 return (1);
95}
98 96
99int BN_rshift1(BIGNUM *r, const BIGNUM *a) 97int
100 { 98BN_rshift1(BIGNUM *r, const BIGNUM *a)
101 BN_ULONG *ap,*rp,t,c; 99{
102 int i,j; 100 BN_ULONG *ap, *rp, t, c;
101 int i, j;
103 102
104 bn_check_top(r); 103 bn_check_top(r);
105 bn_check_top(a); 104 bn_check_top(a);
106 105
107 if (BN_is_zero(a)) 106 if (BN_is_zero(a)) {
108 {
109 BN_zero(r); 107 BN_zero(r);
110 return(1); 108 return (1);
111 } 109 }
112 i = a->top; 110 i = a->top;
113 ap= a->d; 111 ap = a->d;
114 j = i-(ap[i-1]==1); 112 j = i - (ap[i - 1]==1);
115 if (a != r) 113 if (a != r) {
116 { 114 if (bn_wexpand(r, j) == NULL)
117 if (bn_wexpand(r,j) == NULL) return(0); 115 return (0);
118 r->neg=a->neg; 116 r->neg = a->neg;
119 }
120 rp=r->d;
121 t=ap[--i];
122 c=(t&1)?BN_TBIT:0;
123 if (t>>=1) rp[i]=t;
124 while (i>0)
125 {
126 t=ap[--i];
127 rp[i]=((t>>1)&BN_MASK2)|c;
128 c=(t&1)?BN_TBIT:0;
129 }
130 r->top=j;
131 bn_check_top(r);
132 return(1);
133 } 117 }
118 rp = r->d;
119 t = ap[--i];
120 c = (t & 1) ? BN_TBIT : 0;
121 if (t >>= 1)
122 rp[i] = t;
123 while (i > 0) {
124 t = ap[--i];
125 rp[i] = ((t >> 1) & BN_MASK2) | c;
126 c = (t & 1) ? BN_TBIT : 0;
127 }
128 r->top = j;
129 bn_check_top(r);
130 return (1);
131}
134 132
135int BN_lshift(BIGNUM *r, const BIGNUM *a, int n) 133int
136 { 134BN_lshift(BIGNUM *r, const BIGNUM *a, int n)
137 int i,nw,lb,rb; 135{
138 BN_ULONG *t,*f; 136 int i, nw, lb, rb;
137 BN_ULONG *t, *f;
139 BN_ULONG l; 138 BN_ULONG l;
140 139
141 bn_check_top(r); 140 bn_check_top(r);
142 bn_check_top(a); 141 bn_check_top(a);
143 142
144 r->neg=a->neg; 143 r->neg = a->neg;
145 nw=n/BN_BITS2; 144 nw = n / BN_BITS2;
146 if (bn_wexpand(r,a->top+nw+1) == NULL) return(0); 145 if (bn_wexpand(r, a->top + nw + 1) == NULL)
147 lb=n%BN_BITS2; 146 return (0);
148 rb=BN_BITS2-lb; 147 lb = n % BN_BITS2;
149 f=a->d; 148 rb = BN_BITS2 - lb;
150 t=r->d; 149 f = a->d;
151 t[a->top+nw]=0; 150 t = r->d;
151 t[a->top + nw] = 0;
152 if (lb == 0) 152 if (lb == 0)
153 for (i=a->top-1; i>=0; i--) 153 for (i = a->top - 1; i >= 0; i--)
154 t[nw+i]=f[i]; 154 t[nw + i] = f[i];
155 else 155 else
156 for (i=a->top-1; i>=0; i--) 156 for (i = a->top - 1; i >= 0; i--) {
157 { 157 l = f[i];
158 l=f[i]; 158 t[nw + i + 1] |= (l >> rb) & BN_MASK2;
159 t[nw+i+1]|=(l>>rb)&BN_MASK2; 159 t[nw + i] = (l << lb) & BN_MASK2;
160 t[nw+i]=(l<<lb)&BN_MASK2; 160 }
161 } 161 memset(t, 0, nw * sizeof(t[0]));
162 memset(t,0,nw*sizeof(t[0]));
163/* for (i=0; i<nw; i++) 162/* for (i=0; i<nw; i++)
164 t[i]=0;*/ 163 t[i]=0;*/
165 r->top=a->top+nw+1; 164 r->top = a->top + nw + 1;
166 bn_correct_top(r); 165 bn_correct_top(r);
167 bn_check_top(r); 166 bn_check_top(r);
168 return(1); 167 return (1);
169 } 168}
170 169
171int BN_rshift(BIGNUM *r, const BIGNUM *a, int n) 170int
172 { 171BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
173 int i,j,nw,lb,rb; 172{
174 BN_ULONG *t,*f; 173 int i, j, nw, lb, rb;
175 BN_ULONG l,tmp; 174 BN_ULONG *t, *f;
175 BN_ULONG l, tmp;
176 176
177 bn_check_top(r); 177 bn_check_top(r);
178 bn_check_top(a); 178 bn_check_top(a);
179 179
180 nw=n/BN_BITS2; 180 nw = n / BN_BITS2;
181 rb=n%BN_BITS2; 181 rb = n % BN_BITS2;
182 lb=BN_BITS2-rb; 182 lb = BN_BITS2 - rb;
183 if (nw >= a->top || a->top == 0) 183 if (nw >= a->top || a->top == 0) {
184 {
185 BN_zero(r); 184 BN_zero(r);
186 return(1); 185 return (1);
187 } 186 }
188 i = (BN_num_bits(a)-n+(BN_BITS2-1))/BN_BITS2; 187 i = (BN_num_bits(a) - n + (BN_BITS2 - 1)) / BN_BITS2;
189 if (r != a) 188 if (r != a) {
190 { 189 r->neg = a->neg;
191 r->neg=a->neg; 190 if (bn_wexpand(r, i) == NULL)
192 if (bn_wexpand(r,i) == NULL) return(0); 191 return (0);
193 } 192 } else {
194 else
195 {
196 if (n == 0) 193 if (n == 0)
197 return 1; /* or the copying loop will go berserk */ 194 return 1; /* or the copying loop will go berserk */
198 } 195 }
199 196
200 f= &(a->d[nw]); 197 f = &(a->d[nw]);
201 t=r->d; 198 t = r->d;
202 j=a->top-nw; 199 j = a->top - nw;
203 r->top=i; 200 r->top = i;
204 201
205 if (rb == 0) 202 if (rb == 0) {
206 { 203 for (i = j; i != 0; i--)
207 for (i=j; i != 0; i--) 204 *(t++) = *(f++);
208 *(t++)= *(f++); 205 } else {
206 l = *(f++);
207 for (i = j - 1; i != 0; i--) {
208 tmp = (l >> rb) & BN_MASK2;
209 l = *(f++);
210 *(t++) = (tmp|(l << lb)) & BN_MASK2;
209 } 211 }
210 else 212 if ((l = (l >> rb) & BN_MASK2))
211 { 213 *(t) = l;
212 l= *(f++);
213 for (i=j-1; i != 0; i--)
214 {
215 tmp =(l>>rb)&BN_MASK2;
216 l= *(f++);
217 *(t++) =(tmp|(l<<lb))&BN_MASK2;
218 }
219 if ((l = (l>>rb)&BN_MASK2)) *(t) = l;
220 }
221 bn_check_top(r);
222 return(1);
223 } 214 }
215 bn_check_top(r);
216 return (1);
217}