diff options
Diffstat (limited to 'src/lib/libcrypto/bn/bn_word.c')
| -rw-r--r-- | src/lib/libcrypto/bn/bn_word.c | 47 |
1 files changed, 21 insertions, 26 deletions
diff --git a/src/lib/libcrypto/bn/bn_word.c b/src/lib/libcrypto/bn/bn_word.c index 4b3d0f011d..cd59baa2c4 100644 --- a/src/lib/libcrypto/bn/bn_word.c +++ b/src/lib/libcrypto/bn/bn_word.c | |||
| @@ -60,9 +60,7 @@ | |||
| 60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
| 61 | #include "bn_lcl.h" | 61 | #include "bn_lcl.h" |
| 62 | 62 | ||
| 63 | BN_ULONG BN_mod_word(a, w) | 63 | BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w) |
| 64 | BIGNUM *a; | ||
| 65 | unsigned long w; | ||
| 66 | { | 64 | { |
| 67 | #ifndef BN_LLONG | 65 | #ifndef BN_LLONG |
| 68 | BN_ULONG ret=0; | 66 | BN_ULONG ret=0; |
| @@ -75,8 +73,8 @@ unsigned long w; | |||
| 75 | for (i=a->top-1; i>=0; i--) | 73 | for (i=a->top-1; i>=0; i--) |
| 76 | { | 74 | { |
| 77 | #ifndef BN_LLONG | 75 | #ifndef BN_LLONG |
| 78 | ret=((ret<<BN_BITS4)|((a->d[i]>>BN_BITS4)&BN_MASK2l))%(unsigned long)w; | 76 | ret=((ret<<BN_BITS4)|((a->d[i]>>BN_BITS4)&BN_MASK2l))%w; |
| 79 | ret=((ret<<BN_BITS4)|(a->d[i]&BN_MASK2l))%(unsigned long)w; | 77 | ret=((ret<<BN_BITS4)|(a->d[i]&BN_MASK2l))%w; |
| 80 | #else | 78 | #else |
| 81 | ret=(BN_ULLONG)(((ret<<(BN_ULLONG)BN_BITS2)|a->d[i])% | 79 | ret=(BN_ULLONG)(((ret<<(BN_ULLONG)BN_BITS2)|a->d[i])% |
| 82 | (BN_ULLONG)w); | 80 | (BN_ULLONG)w); |
| @@ -85,9 +83,7 @@ unsigned long w; | |||
| 85 | return((BN_ULONG)ret); | 83 | return((BN_ULONG)ret); |
| 86 | } | 84 | } |
| 87 | 85 | ||
| 88 | BN_ULONG BN_div_word(a, w) | 86 | BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w) |
| 89 | BIGNUM *a; | ||
| 90 | unsigned long w; | ||
| 91 | { | 87 | { |
| 92 | BN_ULONG ret; | 88 | BN_ULONG ret; |
| 93 | int i; | 89 | int i; |
| @@ -100,18 +96,16 @@ unsigned long w; | |||
| 100 | BN_ULONG l,d; | 96 | BN_ULONG l,d; |
| 101 | 97 | ||
| 102 | l=a->d[i]; | 98 | l=a->d[i]; |
| 103 | d=bn_div64(ret,l,w); | 99 | d=bn_div_words(ret,l,w); |
| 104 | ret=(l-((d*w)&BN_MASK2))&BN_MASK2; | 100 | ret=(l-((d*w)&BN_MASK2))&BN_MASK2; |
| 105 | a->d[i]=d; | 101 | a->d[i]=d; |
| 106 | } | 102 | } |
| 107 | if (a->d[a->top-1] == 0) | 103 | if ((a->top > 0) && (a->d[a->top-1] == 0)) |
| 108 | a->top--; | 104 | a->top--; |
| 109 | return(ret); | 105 | return(ret); |
| 110 | } | 106 | } |
| 111 | 107 | ||
| 112 | int BN_add_word(a, w) | 108 | int BN_add_word(BIGNUM *a, BN_ULONG w) |
| 113 | BIGNUM *a; | ||
| 114 | unsigned long w; | ||
| 115 | { | 109 | { |
| 116 | BN_ULONG l; | 110 | BN_ULONG l; |
| 117 | int i; | 111 | int i; |
| @@ -121,7 +115,7 @@ unsigned long w; | |||
| 121 | a->neg=0; | 115 | a->neg=0; |
| 122 | i=BN_sub_word(a,w); | 116 | i=BN_sub_word(a,w); |
| 123 | if (!BN_is_zero(a)) | 117 | if (!BN_is_zero(a)) |
| 124 | a->neg=1; | 118 | a->neg=!(a->neg); |
| 125 | return(i); | 119 | return(i); |
| 126 | } | 120 | } |
| 127 | w&=BN_MASK2; | 121 | w&=BN_MASK2; |
| @@ -142,13 +136,11 @@ unsigned long w; | |||
| 142 | return(1); | 136 | return(1); |
| 143 | } | 137 | } |
| 144 | 138 | ||
| 145 | int BN_sub_word(a, w) | 139 | int BN_sub_word(BIGNUM *a, BN_ULONG w) |
| 146 | BIGNUM *a; | ||
| 147 | unsigned long w; | ||
| 148 | { | 140 | { |
| 149 | int i; | 141 | int i; |
| 150 | 142 | ||
| 151 | if (a->neg) | 143 | if (BN_is_zero(a) || a->neg) |
| 152 | { | 144 | { |
| 153 | a->neg=0; | 145 | a->neg=0; |
| 154 | i=BN_add_word(a,w); | 146 | i=BN_add_word(a,w); |
| @@ -183,22 +175,25 @@ unsigned long w; | |||
| 183 | return(1); | 175 | return(1); |
| 184 | } | 176 | } |
| 185 | 177 | ||
| 186 | int BN_mul_word(a,w) | 178 | int BN_mul_word(BIGNUM *a, BN_ULONG w) |
| 187 | BIGNUM *a; | ||
| 188 | unsigned long w; | ||
| 189 | { | 179 | { |
| 190 | BN_ULONG ll; | 180 | BN_ULONG ll; |
| 191 | 181 | ||
| 192 | w&=BN_MASK2; | 182 | w&=BN_MASK2; |
| 193 | if (a->top) | 183 | if (a->top) |
| 194 | { | 184 | { |
| 195 | ll=bn_mul_words(a->d,a->d,a->top,w); | 185 | if (w == 0) |
| 196 | if (ll) | 186 | BN_zero(a); |
| 187 | else | ||
| 197 | { | 188 | { |
| 198 | if (bn_wexpand(a,a->top+1) == NULL) return(0); | 189 | ll=bn_mul_words(a->d,a->d,a->top,w); |
| 199 | a->d[a->top++]=ll; | 190 | if (ll) |
| 191 | { | ||
| 192 | if (bn_wexpand(a,a->top+1) == NULL) return(0); | ||
| 193 | a->d[a->top++]=ll; | ||
| 194 | } | ||
| 200 | } | 195 | } |
| 201 | } | 196 | } |
| 202 | return(0); | 197 | return(1); |
| 203 | } | 198 | } |
| 204 | 199 | ||
