/[rdesktop]/sourceforge.net/trunk/rdesktop/crypto/bn_sqr.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /sourceforge.net/trunk/rdesktop/crypto/bn_sqr.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 195 - (hide annotations)
Wed Sep 25 09:00:57 2002 UTC (21 years, 9 months ago) by matthewc
File MIME type: text/plain
File size: 7293 byte(s)
Sync crypto/ with OpenSSL 0.9.6g (trivial changes only).

1 matty 32 /* crypto/bn/bn_sqr.c */
2     /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3     * All rights reserved.
4     *
5     * This package is an SSL implementation written
6     * by Eric Young (eay@cryptsoft.com).
7     * The implementation was written so as to conform with Netscapes SSL.
8     *
9     * This library is free for commercial and non-commercial use as long as
10     * the following conditions are aheared to. The following conditions
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
13     * included with this distribution is covered by the same copyright terms
14     * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15     *
16     * Copyright remains Eric Young's, and as such any Copyright notices in
17     * the code are not to be removed.
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.
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.
22     *
23     * Redistribution and use in source and binary forms, with or without
24     * modification, are permitted provided that the following conditions
25     * are met:
26     * 1. Redistributions of source code must retain the copyright
27     * notice, this list of conditions and the following disclaimer.
28     * 2. Redistributions in binary form must reproduce the above copyright
29     * notice, this list of conditions and the following disclaimer in the
30     * documentation and/or other materials provided with the distribution.
31     * 3. All advertising materials mentioning features or use of this software
32     * must display the following acknowledgement:
33     * "This product includes cryptographic software written by
34     * Eric Young (eay@cryptsoft.com)"
35     * The word 'cryptographic' can be left out if the rouines from the library
36     * being used are not cryptographic related :-).
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:
39     * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40     *
41     * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44     * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
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
51     * SUCH DAMAGE.
52     *
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
55     * copied and put under another distribution licence
56     * [including the GNU Public Licence.]
57     */
58    
59     #include <stdio.h>
60     #include "bn_lcl.h"
61    
62     /* r must not be a */
63     /* I've just gone over this and it is now %20 faster on x86 - eay - 27 Jun 96 */
64     int BN_sqr(BIGNUM *r, BIGNUM *a, BN_CTX *ctx)
65     {
66     int max,al;
67     int ret = 0;
68     BIGNUM *tmp,*rr;
69    
70     #ifdef BN_COUNT
71     printf("BN_sqr %d * %d\n",a->top,a->top);
72     #endif
73     bn_check_top(a);
74    
75     al=a->top;
76     if (al <= 0)
77     {
78     r->top=0;
79     return(1);
80     }
81    
82     BN_CTX_start(ctx);
83     rr=(a != r) ? r : BN_CTX_get(ctx);
84     tmp=BN_CTX_get(ctx);
85     if (tmp == NULL) goto err;
86    
87     max=(al+al);
88     if (bn_wexpand(rr,max+1) == NULL) goto err;
89    
90     r->neg=0;
91     if (al == 4)
92     {
93     #ifndef BN_SQR_COMBA
94     BN_ULONG t[8];
95     bn_sqr_normal(rr->d,a->d,4,t);
96     #else
97     bn_sqr_comba4(rr->d,a->d);
98     #endif
99     }
100     else if (al == 8)
101     {
102     #ifndef BN_SQR_COMBA
103     BN_ULONG t[16];
104     bn_sqr_normal(rr->d,a->d,8,t);
105     #else
106     bn_sqr_comba8(rr->d,a->d);
107     #endif
108     }
109     else
110     {
111     #if defined(BN_RECURSION)
112     if (al < BN_SQR_RECURSIVE_SIZE_NORMAL)
113     {
114     BN_ULONG t[BN_SQR_RECURSIVE_SIZE_NORMAL*2];
115     bn_sqr_normal(rr->d,a->d,al,t);
116     }
117     else
118     {
119     int j,k;
120    
121     j=BN_num_bits_word((BN_ULONG)al);
122     j=1<<(j-1);
123     k=j+j;
124     if (al == j)
125     {
126     if (bn_wexpand(a,k*2) == NULL) goto err;
127     if (bn_wexpand(tmp,k*2) == NULL) goto err;
128     bn_sqr_recursive(rr->d,a->d,al,tmp->d);
129     }
130     else
131     {
132     if (bn_wexpand(tmp,max) == NULL) goto err;
133     bn_sqr_normal(rr->d,a->d,al,tmp->d);
134     }
135     }
136     #else
137     if (bn_wexpand(tmp,max) == NULL) goto err;
138     bn_sqr_normal(rr->d,a->d,al,tmp->d);
139     #endif
140     }
141    
142     rr->top=max;
143     if ((max > 0) && (rr->d[max-1] == 0)) rr->top--;
144     if (rr != r) BN_copy(r,rr);
145     ret = 1;
146     err:
147     BN_CTX_end(ctx);
148     return(ret);
149     }
150    
151     /* tmp must have 2*n words */
152     void bn_sqr_normal(BN_ULONG *r, BN_ULONG *a, int n, BN_ULONG *tmp)
153     {
154     int i,j,max;
155     BN_ULONG *ap,*rp;
156    
157     max=n*2;
158     ap=a;
159     rp=r;
160     rp[0]=rp[max-1]=0;
161     rp++;
162     j=n;
163    
164     if (--j > 0)
165     {
166     ap++;
167     rp[j]=bn_mul_words(rp,ap,j,ap[-1]);
168     rp+=2;
169     }
170    
171     for (i=n-2; i>0; i--)
172     {
173     j--;
174     ap++;
175     rp[j]=bn_mul_add_words(rp,ap,j,ap[-1]);
176     rp+=2;
177     }
178    
179     bn_add_words(r,r,r,max);
180    
181     /* There will not be a carry */
182    
183     bn_sqr_words(tmp,a,n);
184    
185     bn_add_words(r,r,tmp,max);
186     }
187    
188     #ifdef BN_RECURSION
189     /* r is 2*n words in size,
190     * a and b are both n words in size. (There's not actually a 'b' here ...)
191     * n must be a power of 2.
192     * We multiply and return the result.
193     * t must be 2*n words in size
194     * We calculate
195     * a[0]*b[0]
196     * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
197     * a[1]*b[1]
198     */
199     void bn_sqr_recursive(BN_ULONG *r, BN_ULONG *a, int n2, BN_ULONG *t)
200     {
201     int n=n2/2;
202     int zero,c1;
203     BN_ULONG ln,lo,*p;
204    
205     #ifdef BN_COUNT
206     printf(" bn_sqr_recursive %d * %d\n",n2,n2);
207     #endif
208     if (n2 == 4)
209     {
210     #ifndef BN_SQR_COMBA
211     bn_sqr_normal(r,a,4,t);
212     #else
213     bn_sqr_comba4(r,a);
214     #endif
215     return;
216     }
217     else if (n2 == 8)
218     {
219     #ifndef BN_SQR_COMBA
220     bn_sqr_normal(r,a,8,t);
221     #else
222     bn_sqr_comba8(r,a);
223     #endif
224     return;
225     }
226     if (n2 < BN_SQR_RECURSIVE_SIZE_NORMAL)
227     {
228     bn_sqr_normal(r,a,n2,t);
229     return;
230     }
231     /* r=(a[0]-a[1])*(a[1]-a[0]) */
232     c1=bn_cmp_words(a,&(a[n]),n);
233     zero=0;
234     if (c1 > 0)
235     bn_sub_words(t,a,&(a[n]),n);
236     else if (c1 < 0)
237     bn_sub_words(t,&(a[n]),a,n);
238     else
239     zero=1;
240    
241     /* The result will always be negative unless it is zero */
242     p= &(t[n2*2]);
243    
244     if (!zero)
245     bn_sqr_recursive(&(t[n2]),t,n,p);
246     else
247 matthewc 195 memset(&(t[n2]),0,n2*sizeof(BN_ULONG));
248 matty 32 bn_sqr_recursive(r,a,n,p);
249     bn_sqr_recursive(&(r[n2]),&(a[n]),n,p);
250    
251     /* t[32] holds (a[0]-a[1])*(a[1]-a[0]), it is negative or zero
252     * r[10] holds (a[0]*b[0])
253     * r[32] holds (b[1]*b[1])
254     */
255    
256     c1=(int)(bn_add_words(t,r,&(r[n2]),n2));
257    
258     /* t[32] is negative */
259     c1-=(int)(bn_sub_words(&(t[n2]),t,&(t[n2]),n2));
260    
261     /* t[32] holds (a[0]-a[1])*(a[1]-a[0])+(a[0]*a[0])+(a[1]*a[1])
262     * r[10] holds (a[0]*a[0])
263     * r[32] holds (a[1]*a[1])
264     * c1 holds the carry bits
265     */
266     c1+=(int)(bn_add_words(&(r[n]),&(r[n]),&(t[n2]),n2));
267     if (c1)
268     {
269     p= &(r[n+n2]);
270     lo= *p;
271     ln=(lo+c1)&BN_MASK2;
272     *p=ln;
273    
274     /* The overflow will stop before we over write
275     * words we should not overwrite */
276     if (ln < (BN_ULONG)c1)
277     {
278     do {
279     p++;
280     lo= *p;
281     ln=(lo+1)&BN_MASK2;
282     *p=ln;
283     } while (ln == 0);
284     }
285     }
286     }
287     #endif

  ViewVC Help
Powered by ViewVC 1.1.26