]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/bn/bn_shift.c
2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #include "internal/cryptlib.h"
13 int BN_lshift1(BIGNUM
*r
, const BIGNUM
*a
)
15 register BN_ULONG
*ap
, *rp
, t
, c
;
23 if (bn_wexpand(r
, a
->top
+ 1) == NULL
)
27 if (bn_wexpand(r
, a
->top
+ 1) == NULL
)
33 for (i
= 0; i
< a
->top
; i
++) {
35 *(rp
++) = ((t
<< 1) | c
) & BN_MASK2
;
36 c
= (t
& BN_TBIT
) ? 1 : 0;
46 int BN_rshift1(BIGNUM
*r
, const BIGNUM
*a
)
48 BN_ULONG
*ap
, *rp
, t
, c
;
60 j
= i
- (ap
[i
- 1] == 1);
62 if (bn_wexpand(r
, j
) == NULL
)
68 c
= (t
& 1) ? BN_TBIT
: 0;
73 rp
[i
] = ((t
>> 1) & BN_MASK2
) | c
;
74 c
= (t
& 1) ? BN_TBIT
: 0;
81 int BN_lshift(BIGNUM
*r
, const BIGNUM
*a
, int n
)
91 BNerr(BN_F_BN_LSHIFT
, BN_R_INVALID_SHIFT
);
97 if (bn_wexpand(r
, a
->top
+ nw
+ 1) == NULL
)
105 for (i
= a
->top
- 1; i
>= 0; i
--)
108 for (i
= a
->top
- 1; i
>= 0; i
--) {
110 t
[nw
+ i
+ 1] |= (l
>> rb
) & BN_MASK2
;
111 t
[nw
+ i
] = (l
<< lb
) & BN_MASK2
;
113 memset(t
, 0, sizeof(*t
) * nw
);
114 r
->top
= a
->top
+ nw
+ 1;
120 int BN_rshift(BIGNUM
*r
, const BIGNUM
*a
, int n
)
122 int i
, j
, nw
, lb
, rb
;
130 BNerr(BN_F_BN_RSHIFT
, BN_R_INVALID_SHIFT
);
137 if (nw
>= a
->top
|| a
->top
== 0) {
141 i
= (BN_num_bits(a
) - n
+ (BN_BITS2
- 1)) / BN_BITS2
;
144 if (bn_wexpand(r
, i
) == NULL
)
148 return 1; /* or the copying loop will go berserk */
157 for (i
= j
; i
!= 0; i
--)
161 for (i
= j
- 1; i
!= 0; i
--) {
162 tmp
= (l
>> rb
) & BN_MASK2
;
164 *(t
++) = (tmp
| (l
<< lb
)) & BN_MASK2
;
166 if ((l
= (l
>> rb
) & BN_MASK2
))