- fix Building without Nagra not possible at Nagra_Merlin https://trac.streamboard...
[oscam.git] / cscrypt / bn_shift.c
blobd020da007a9d9afe96075a87790bdaa8f8c80c92
1 #include "bn.h"
3 #ifndef WITH_LIBCRYPTO
4 //FIXME Not checked on threadsafety yet; after checking please remove this line
5 /* crypto/bn/bn_shift.c */
6 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
7 * All rights reserved.
9 * This package is an SSL implementation written
10 * by Eric Young (eay@cryptsoft.com).
11 * The implementation was written so as to conform with Netscapes SSL.
13 * This library is free for commercial and non-commercial use as long as
14 * the following conditions are aheared to. The following conditions
15 * apply to all code found in this distribution, be it the RC4, RSA,
16 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
17 * included with this distribution is covered by the same copyright terms
18 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
20 * Copyright remains Eric Young's, and as such any Copyright notices in
21 * the code are not to be removed.
22 * If this package is used in a product, Eric Young should be given attribution
23 * as the author of the parts of the library used.
24 * This can be in the form of a textual message at program startup or
25 * in documentation (online or textual) provided with the package.
27 * Redistribution and use in source and binary forms, with or without
28 * modification, are permitted provided that the following conditions
29 * are met:
30 * 1. Redistributions of source code must retain the copyright
31 * notice, this list of conditions and the following disclaimer.
32 * 2. Redistributions in binary form must reproduce the above copyright
33 * notice, this list of conditions and the following disclaimer in the
34 * documentation and/or other materials provided with the distribution.
35 * 3. All advertising materials mentioning features or use of this software
36 * must display the following acknowledgement:
37 * "This product includes cryptographic software written by
38 * Eric Young (eay@cryptsoft.com)"
39 * The word 'cryptographic' can be left out if the rouines from the library
40 * being used are not cryptographic related :-).
41 * 4. If you include any Windows specific code (or a derivative thereof) from
42 * the apps directory (application code) you must include an acknowledgement:
43 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
45 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 * SUCH DAMAGE.
57 * The license and distribution terms for any publically available version or
58 * derivative of this code cannot be changed. i.e. this code cannot simply be
59 * copied and put under another distribution license
60 * [including the GNU Public License.]
63 #include <stdio.h>
64 #include <string.h>
65 #include "bn_lcl.h"
66 #include "openssl_mods.h"
68 int BN_lshift1(BIGNUM *r, BIGNUM *a)
70 register BN_ULONG *ap, *rp, t, c;
71 int i;
73 if(r != a)
75 r->neg = a->neg;
76 if(bn_wexpand(r, a->top + 1) == NULL) { return (0); }
77 r->top = a->top;
79 else
81 if(bn_wexpand(r, a->top + 1) == NULL) { return (0); }
83 ap = a->d;
84 rp = r->d;
85 c = 0;
86 for(i = 0; i < a->top; i++)
88 t = *(ap++);
89 *(rp++) = ((t << 1) | c)&BN_MASK2;
90 c = (t & BN_TBIT) ? 1 : 0;
92 if(c)
94 *rp = 1;
95 r->top++;
97 return (1);
100 int BN_rshift1(BIGNUM *r, BIGNUM *a)
102 BN_ULONG *ap, *rp, t, c;
103 int i;
105 if(BN_is_zero(a))
107 BN_zero(r);
108 return (1);
110 if(a != r)
112 if(bn_wexpand(r, a->top) == NULL) { return (0); }
113 r->top = a->top;
114 r->neg = a->neg;
116 ap = a->d;
117 rp = r->d;
118 c = 0;
119 for(i = a->top - 1; i >= 0; i--)
121 t = ap[i];
122 rp[i] = ((t >> 1)&BN_MASK2) | c;
123 c = (t & 1) ? BN_TBIT : 0;
125 bn_fix_top(r);
126 return (1);
129 int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)
131 int i, nw, lb, rb;
132 BN_ULONG *t, *f;
133 BN_ULONG l;
135 r->neg = a->neg;
136 if(bn_wexpand(r, a->top + (n / BN_BITS2) + 1) == NULL) { return (0); }
137 nw = n / BN_BITS2;
138 lb = n % BN_BITS2;
139 rb = BN_BITS2 - lb;
140 f = a->d;
141 t = r->d;
142 t[a->top + nw] = 0;
143 if(lb == 0)
144 for(i = a->top - 1; i >= 0; i--)
145 { t[nw + i] = f[i]; }
146 else
147 for(i = a->top - 1; i >= 0; i--)
149 l = f[i];
150 t[nw + i + 1] |= (l >> rb)&BN_MASK2;
151 t[nw + i] = (l << lb)&BN_MASK2;
153 memset(t, 0, nw * sizeof(t[0]));
154 /* for (i=0; i<nw; i++)
155 t[i]=0;*/
156 r->top = a->top + nw + 1;
157 bn_fix_top(r);
158 return (1);
161 int BN_rshift(BIGNUM *r, BIGNUM *a, int n)
163 int i, j, nw, lb, rb;
164 BN_ULONG *t, *f;
165 BN_ULONG l, tmp;
167 nw = n / BN_BITS2;
168 rb = n % BN_BITS2;
169 lb = BN_BITS2 - rb;
170 if(nw > a->top || a->top == 0)
172 BN_zero(r);
173 return (1);
175 if(r != a)
177 r->neg = a->neg;
178 if(bn_wexpand(r, a->top - nw + 1) == NULL) { return (0); }
180 else
182 if(n == 0)
183 { return 1; } /* or the copying loop will go berserk */
186 f = &(a->d[nw]);
187 t = r->d;
188 j = a->top - nw;
189 r->top = j;
191 if(rb == 0)
193 for(i = j + 1; i > 0; i--)
194 { *(t++) = *(f++); }
196 else
198 l = *(f++);
199 for(i = 1; i < j; i++)
201 tmp = (l >> rb)&BN_MASK2;
202 l = *(f++);
203 *(t++) = (tmp | (l << lb))&BN_MASK2;
205 *(t++) = (l >> rb)&BN_MASK2;
207 *t = 0;
208 bn_fix_top(r);
209 return (1);
211 #endif