diff options
author | jsing <> | 2023-02-09 09:16:26 +0000 |
---|---|---|
committer | jsing <> | 2023-02-09 09:16:26 +0000 |
commit | 270a7fa5b0dcd84c8c8239f5abd043cfd7498ab6 (patch) | |
tree | b8c6b193fe42cb99a80bb8f15b6b256747170588 /src | |
parent | 8682251898e9d78e4b4fb68e97615ae3edc97fc4 (diff) | |
download | openbsd-270a7fa5b0dcd84c8c8239f5abd043cfd7498ab6.tar.gz openbsd-270a7fa5b0dcd84c8c8239f5abd043cfd7498ab6.tar.bz2 openbsd-270a7fa5b0dcd84c8c8239f5abd043cfd7498ab6.zip |
Clean up bn_sqr_words()
Currently there are two versions of bn_sqr_words(), which call the sqr or
sqr64 macro. Replace this with a single version that calls bn_umul_hilo()
and remove the various implementations of the sqr macro. The only slight
downside is that sqr64 does three multiplications instead of four, given
that the second and third terms are identical. However, this is a minimal
gain for the amount of duplication and entanglement it introduces.
ok tb@
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/bn/bn_local.h | 20 | ||||
-rw-r--r-- | src/lib/libcrypto/bn/bn_sqr.c | 43 |
2 files changed, 10 insertions, 53 deletions
diff --git a/src/lib/libcrypto/bn/bn_local.h b/src/lib/libcrypto/bn/bn_local.h index 904eaa0f05..4ea54d2320 100644 --- a/src/lib/libcrypto/bn/bn_local.h +++ b/src/lib/libcrypto/bn/bn_local.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: bn_local.h,v 1.7 2023/02/03 04:47:59 jsing Exp $ */ | 1 | /* $OpenBSD: bn_local.h,v 1.8 2023/02/09 09:16:26 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -342,13 +342,6 @@ struct bn_gencb_st { | |||
342 | (c)= Hw(t); \ | 342 | (c)= Hw(t); \ |
343 | } | 343 | } |
344 | 344 | ||
345 | #define sqr(r0,r1,a) { \ | ||
346 | BN_ULLONG t; \ | ||
347 | t=(BN_ULLONG)(a)*(a); \ | ||
348 | (r0)=Lw(t); \ | ||
349 | (r1)=Hw(t); \ | ||
350 | } | ||
351 | |||
352 | #elif defined(BN_UMULT_LOHI) | 345 | #elif defined(BN_UMULT_LOHI) |
353 | #define mul_add(r,a,w,c) { \ | 346 | #define mul_add(r,a,w,c) { \ |
354 | BN_ULONG high,low,ret,tmp=(a); \ | 347 | BN_ULONG high,low,ret,tmp=(a); \ |
@@ -371,11 +364,6 @@ struct bn_gencb_st { | |||
371 | (r) = ret; \ | 364 | (r) = ret; \ |
372 | } | 365 | } |
373 | 366 | ||
374 | #define sqr(r0,r1,a) { \ | ||
375 | BN_ULONG tmp=(a); \ | ||
376 | BN_UMULT_LOHI(r0,r1,tmp,tmp); \ | ||
377 | } | ||
378 | |||
379 | #elif defined(BN_UMULT_HIGH) | 367 | #elif defined(BN_UMULT_HIGH) |
380 | #define mul_add(r,a,w,c) { \ | 368 | #define mul_add(r,a,w,c) { \ |
381 | BN_ULONG high,low,ret,tmp=(a); \ | 369 | BN_ULONG high,low,ret,tmp=(a); \ |
@@ -400,12 +388,6 @@ struct bn_gencb_st { | |||
400 | (r) = ret; \ | 388 | (r) = ret; \ |
401 | } | 389 | } |
402 | 390 | ||
403 | #define sqr(r0,r1,a) { \ | ||
404 | BN_ULONG tmp=(a); \ | ||
405 | (r0) = tmp * tmp; \ | ||
406 | (r1) = BN_UMULT_HIGH(tmp,tmp); \ | ||
407 | } | ||
408 | |||
409 | #else | 391 | #else |
410 | /************************************************************* | 392 | /************************************************************* |
411 | * No long long type | 393 | * No long long type |
diff --git a/src/lib/libcrypto/bn/bn_sqr.c b/src/lib/libcrypto/bn/bn_sqr.c index 74d5eded94..940cdd33bd 100644 --- a/src/lib/libcrypto/bn/bn_sqr.c +++ b/src/lib/libcrypto/bn/bn_sqr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: bn_sqr.c,v 1.22 2023/01/23 12:09:06 jsing Exp $ */ | 1 | /* $OpenBSD: bn_sqr.c,v 1.23 2023/02/09 09:16:26 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -180,33 +180,9 @@ bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a) | |||
180 | #endif | 180 | #endif |
181 | 181 | ||
182 | #ifndef HAVE_BN_SQR_WORDS | 182 | #ifndef HAVE_BN_SQR_WORDS |
183 | #if defined(BN_LLONG) || defined(BN_UMULT_HIGH) | 183 | /* |
184 | void | 184 | * bn_sqr_words() computes (r[i*2+1]:r[i*2]) = a[i] * a[i]. |
185 | bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n) | 185 | */ |
186 | { | ||
187 | assert(n >= 0); | ||
188 | if (n <= 0) | ||
189 | return; | ||
190 | |||
191 | #ifndef OPENSSL_SMALL_FOOTPRINT | ||
192 | while (n & ~3) { | ||
193 | sqr(r[0], r[1], a[0]); | ||
194 | sqr(r[2], r[3], a[1]); | ||
195 | sqr(r[4], r[5], a[2]); | ||
196 | sqr(r[6], r[7], a[3]); | ||
197 | a += 4; | ||
198 | r += 8; | ||
199 | n -= 4; | ||
200 | } | ||
201 | #endif | ||
202 | while (n) { | ||
203 | sqr(r[0], r[1], a[0]); | ||
204 | a++; | ||
205 | r += 2; | ||
206 | n--; | ||
207 | } | ||
208 | } | ||
209 | #else /* !(defined(BN_LLONG) || defined(BN_UMULT_HIGH)) */ | ||
210 | void | 186 | void |
211 | bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n) | 187 | bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n) |
212 | { | 188 | { |
@@ -216,24 +192,23 @@ bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n) | |||
216 | 192 | ||
217 | #ifndef OPENSSL_SMALL_FOOTPRINT | 193 | #ifndef OPENSSL_SMALL_FOOTPRINT |
218 | while (n & ~3) { | 194 | while (n & ~3) { |
219 | sqr64(r[0], r[1], a[0]); | 195 | bn_umul_hilo(a[0], a[0], &r[1], &r[0]); |
220 | sqr64(r[2], r[3], a[1]); | 196 | bn_umul_hilo(a[1], a[1], &r[3], &r[2]); |
221 | sqr64(r[4], r[5], a[2]); | 197 | bn_umul_hilo(a[2], a[2], &r[5], &r[4]); |
222 | sqr64(r[6], r[7], a[3]); | 198 | bn_umul_hilo(a[3], a[3], &r[7], &r[6]); |
223 | a += 4; | 199 | a += 4; |
224 | r += 8; | 200 | r += 8; |
225 | n -= 4; | 201 | n -= 4; |
226 | } | 202 | } |
227 | #endif | 203 | #endif |
228 | while (n) { | 204 | while (n) { |
229 | sqr64(r[0], r[1], a[0]); | 205 | bn_umul_hilo(a[0], a[0], &r[1], &r[0]); |
230 | a++; | 206 | a++; |
231 | r += 2; | 207 | r += 2; |
232 | n--; | 208 | n--; |
233 | } | 209 | } |
234 | } | 210 | } |
235 | #endif | 211 | #endif |
236 | #endif | ||
237 | 212 | ||
238 | /* tmp must have 2*n words */ | 213 | /* tmp must have 2*n words */ |
239 | void | 214 | void |