mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-08-12 00:43:38 +08:00
Merge remote-tracking branch 'origin/master'
# Conflicts: # README.md
This commit is contained in:
@@ -1,69 +1,14 @@
|
||||
/* crypto/bn/bn_mul.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#ifndef BN_DEBUG
|
||||
# undef NDEBUG /* avoid conflicting definitions */
|
||||
# define NDEBUG
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include "bn_lcl.h"
|
||||
|
||||
#if defined(OPENSSL_NO_ASM) || !defined(OPENSSL_BN_ASM_PART_WORDS)
|
||||
@@ -71,7 +16,7 @@
|
||||
* Here follows specialised variants of bn_add_words() and bn_sub_words().
|
||||
* They have the property performing operations on arrays of different sizes.
|
||||
* The sizes of those arrays is expressed through cl, which is the common
|
||||
* length ( basicall, min(len(a),len(b)) ), and dl, which is the delta
|
||||
* length ( basically, min(len(a),len(b)) ), and dl, which is the delta
|
||||
* between the two lengths, calculated as len(a)-len(b). All lengths are the
|
||||
* number of BN_ULONGs... For the operations that require a result array as
|
||||
* parameter, it must have the length cl+abs(dl). These functions should
|
||||
@@ -96,10 +41,6 @@ BN_ULONG bn_sub_part_words(BN_ULONG *r,
|
||||
b += cl;
|
||||
|
||||
if (dl < 0) {
|
||||
# ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_sub_part_words %d + %d (dl < 0, c = %d)\n", cl,
|
||||
dl, c);
|
||||
# endif
|
||||
for (;;) {
|
||||
t = b[0];
|
||||
r[0] = (0 - t - c) & BN_MASK2;
|
||||
@@ -134,10 +75,6 @@ BN_ULONG bn_sub_part_words(BN_ULONG *r,
|
||||
}
|
||||
} else {
|
||||
int save_dl = dl;
|
||||
# ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_sub_part_words %d + %d (dl > 0, c = %d)\n", cl,
|
||||
dl, c);
|
||||
# endif
|
||||
while (c) {
|
||||
t = a[0];
|
||||
r[0] = (t - c) & BN_MASK2;
|
||||
@@ -172,10 +109,6 @@ BN_ULONG bn_sub_part_words(BN_ULONG *r,
|
||||
r += 4;
|
||||
}
|
||||
if (dl > 0) {
|
||||
# ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_sub_part_words %d + %d (dl > 0, c == 0)\n",
|
||||
cl, dl);
|
||||
# endif
|
||||
if (save_dl > dl) {
|
||||
switch (save_dl - dl) {
|
||||
case 1:
|
||||
@@ -196,10 +129,6 @@ BN_ULONG bn_sub_part_words(BN_ULONG *r,
|
||||
}
|
||||
}
|
||||
if (dl > 0) {
|
||||
# ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_sub_part_words %d + %d (dl > 0, copy)\n",
|
||||
cl, dl);
|
||||
# endif
|
||||
for (;;) {
|
||||
r[0] = a[0];
|
||||
if (--dl <= 0)
|
||||
@@ -241,10 +170,6 @@ BN_ULONG bn_add_part_words(BN_ULONG *r,
|
||||
|
||||
if (dl < 0) {
|
||||
int save_dl = dl;
|
||||
#ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_add_part_words %d + %d (dl < 0, c = %d)\n", cl,
|
||||
dl, c);
|
||||
#endif
|
||||
while (c) {
|
||||
l = (c + b[0]) & BN_MASK2;
|
||||
c = (l < c);
|
||||
@@ -275,10 +200,6 @@ BN_ULONG bn_add_part_words(BN_ULONG *r,
|
||||
r += 4;
|
||||
}
|
||||
if (dl < 0) {
|
||||
#ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_add_part_words %d + %d (dl < 0, c == 0)\n",
|
||||
cl, dl);
|
||||
#endif
|
||||
if (save_dl < dl) {
|
||||
switch (dl - save_dl) {
|
||||
case 1:
|
||||
@@ -299,10 +220,6 @@ BN_ULONG bn_add_part_words(BN_ULONG *r,
|
||||
}
|
||||
}
|
||||
if (dl < 0) {
|
||||
#ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_add_part_words %d + %d (dl < 0, copy)\n",
|
||||
cl, dl);
|
||||
#endif
|
||||
for (;;) {
|
||||
r[0] = b[0];
|
||||
if (++dl >= 0)
|
||||
@@ -323,9 +240,6 @@ BN_ULONG bn_add_part_words(BN_ULONG *r,
|
||||
}
|
||||
} else {
|
||||
int save_dl = dl;
|
||||
#ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_add_part_words %d + %d (dl > 0)\n", cl, dl);
|
||||
#endif
|
||||
while (c) {
|
||||
t = (a[0] + c) & BN_MASK2;
|
||||
c = (t < c);
|
||||
@@ -355,10 +269,6 @@ BN_ULONG bn_add_part_words(BN_ULONG *r,
|
||||
a += 4;
|
||||
r += 4;
|
||||
}
|
||||
#ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_add_part_words %d + %d (dl > 0, c == 0)\n", cl,
|
||||
dl);
|
||||
#endif
|
||||
if (dl > 0) {
|
||||
if (save_dl > dl) {
|
||||
switch (save_dl - dl) {
|
||||
@@ -380,10 +290,6 @@ BN_ULONG bn_add_part_words(BN_ULONG *r,
|
||||
}
|
||||
}
|
||||
if (dl > 0) {
|
||||
#ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_add_part_words %d + %d (dl > 0, copy)\n",
|
||||
cl, dl);
|
||||
#endif
|
||||
for (;;) {
|
||||
r[0] = a[0];
|
||||
if (--dl <= 0)
|
||||
@@ -432,9 +338,6 @@ void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
|
||||
unsigned int neg, zero;
|
||||
BN_ULONG ln, lo, *p;
|
||||
|
||||
# ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_mul_recursive %d%+d * %d%+d\n", n2, dna, n2, dnb);
|
||||
# endif
|
||||
# ifdef BN_MUL_COMBA
|
||||
# if 0
|
||||
if (n2 == 4) {
|
||||
@@ -501,7 +404,7 @@ void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
|
||||
if (!zero)
|
||||
bn_mul_comba4(&(t[n2]), t, &(t[n]));
|
||||
else
|
||||
memset(&(t[n2]), 0, 8 * sizeof(BN_ULONG));
|
||||
memset(&t[n2], 0, sizeof(*t) * 8);
|
||||
|
||||
bn_mul_comba4(r, a, b);
|
||||
bn_mul_comba4(&(r[n2]), &(a[n]), &(b[n]));
|
||||
@@ -511,7 +414,7 @@ void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
|
||||
if (!zero)
|
||||
bn_mul_comba8(&(t[n2]), t, &(t[n]));
|
||||
else
|
||||
memset(&(t[n2]), 0, 16 * sizeof(BN_ULONG));
|
||||
memset(&t[n2], 0, sizeof(*t) * 16);
|
||||
|
||||
bn_mul_comba8(r, a, b);
|
||||
bn_mul_comba8(&(r[n2]), &(a[n]), &(b[n]));
|
||||
@@ -522,7 +425,7 @@ void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
|
||||
if (!zero)
|
||||
bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p);
|
||||
else
|
||||
memset(&(t[n2]), 0, n2 * sizeof(BN_ULONG));
|
||||
memset(&t[n2], 0, sizeof(*t) * n2);
|
||||
bn_mul_recursive(r, a, b, n, 0, 0, p);
|
||||
bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), n, dna, dnb, p);
|
||||
}
|
||||
@@ -581,10 +484,6 @@ void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n,
|
||||
int c1, c2, neg;
|
||||
BN_ULONG ln, lo, *p;
|
||||
|
||||
# ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_mul_part_recursive (%d%+d) * (%d%+d)\n",
|
||||
n, tna, n, tnb);
|
||||
# endif
|
||||
if (n < 8) {
|
||||
bn_mul_normal(r, a, n + tna, b, n + tnb);
|
||||
return;
|
||||
@@ -631,14 +530,14 @@ void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n,
|
||||
bn_mul_comba4(&(t[n2]), t, &(t[n]));
|
||||
bn_mul_comba4(r, a, b);
|
||||
bn_mul_normal(&(r[n2]), &(a[n]), tn, &(b[n]), tn);
|
||||
memset(&(r[n2 + tn * 2]), 0, sizeof(BN_ULONG) * (n2 - tn * 2));
|
||||
memset(&r[n2 + tn * 2], 0, sizeof(*r) * (n2 - tn * 2));
|
||||
} else
|
||||
# endif
|
||||
if (n == 8) {
|
||||
bn_mul_comba8(&(t[n2]), t, &(t[n]));
|
||||
bn_mul_comba8(r, a, b);
|
||||
bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb);
|
||||
memset(&(r[n2 + tna + tnb]), 0, sizeof(BN_ULONG) * (n2 - tna - tnb));
|
||||
memset(&r[n2 + tna + tnb], 0, sizeof(*r) * (n2 - tna - tnb));
|
||||
} else {
|
||||
p = &(t[n2 * 2]);
|
||||
bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p);
|
||||
@@ -654,7 +553,7 @@ void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n,
|
||||
if (j == 0) {
|
||||
bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]),
|
||||
i, tna - i, tnb - i, p);
|
||||
memset(&(r[n2 + i * 2]), 0, sizeof(BN_ULONG) * (n2 - i * 2));
|
||||
memset(&r[n2 + i * 2], 0, sizeof(*r) * (n2 - i * 2));
|
||||
} else if (j > 0) { /* eg, n == 16, i == 8 and tn == 11 */
|
||||
bn_mul_part_recursive(&(r[n2]), &(a[n]), &(b[n]),
|
||||
i, tna - i, tnb - i, p);
|
||||
@@ -662,7 +561,7 @@ void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n,
|
||||
sizeof(BN_ULONG) * (n2 - tna - tnb));
|
||||
} else { /* (j < 0) eg, n == 16, i == 8 and tn == 5 */
|
||||
|
||||
memset(&(r[n2]), 0, sizeof(BN_ULONG) * n2);
|
||||
memset(&r[n2], 0, sizeof(*r) * n2);
|
||||
if (tna < BN_MUL_RECURSIVE_SIZE_NORMAL
|
||||
&& tnb < BN_MUL_RECURSIVE_SIZE_NORMAL) {
|
||||
bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb);
|
||||
@@ -741,10 +640,6 @@ void bn_mul_low_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
|
||||
{
|
||||
int n = n2 / 2;
|
||||
|
||||
# ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_mul_low_recursive %d * %d\n", n2, n2);
|
||||
# endif
|
||||
|
||||
bn_mul_recursive(r, a, b, n, 0, 0, &(t[0]));
|
||||
if (n >= BN_MUL_LOW_RECURSIVE_SIZE_NORMAL) {
|
||||
bn_mul_low_recursive(&(t[0]), &(a[0]), &(b[n]), n, &(t[n2]));
|
||||
@@ -773,9 +668,6 @@ void bn_mul_high(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, BN_ULONG *l, int n2,
|
||||
int neg, oneg, zero;
|
||||
BN_ULONG ll, lc, *lp, *mp;
|
||||
|
||||
# ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_mul_high %d * %d\n", n2, n2);
|
||||
# endif
|
||||
n = n2 / 2;
|
||||
|
||||
/* Calculate (al-ah)*(bh-bl) */
|
||||
@@ -837,9 +729,8 @@ void bn_mul_high(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, BN_ULONG *l, int n2,
|
||||
*/
|
||||
if (l != NULL) {
|
||||
lp = &(t[n2 + n]);
|
||||
c1 = (int)(bn_add_words(lp, &(r[0]), &(l[0]), n));
|
||||
bn_add_words(lp, &(r[0]), &(l[0]), n);
|
||||
} else {
|
||||
c1 = 0;
|
||||
lp = &(r[0]);
|
||||
}
|
||||
|
||||
@@ -947,10 +838,6 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
|
||||
int j = 0, k;
|
||||
#endif
|
||||
|
||||
#ifdef BN_COUNT
|
||||
fprintf(stderr, "BN_mul %d * %d\n", a->top, b->top);
|
||||
#endif
|
||||
|
||||
bn_check_top(a);
|
||||
bn_check_top(b);
|
||||
bn_check_top(r);
|
||||
@@ -1083,8 +970,9 @@ int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
|
||||
end:
|
||||
#endif
|
||||
bn_correct_top(rr);
|
||||
if (r != rr)
|
||||
BN_copy(r, rr);
|
||||
if (r != rr && BN_copy(r, rr) == NULL)
|
||||
goto err;
|
||||
|
||||
ret = 1;
|
||||
err:
|
||||
bn_check_top(r);
|
||||
@@ -1096,10 +984,6 @@ void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, int nb)
|
||||
{
|
||||
BN_ULONG *rr;
|
||||
|
||||
#ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_mul_normal %d * %d\n", na, nb);
|
||||
#endif
|
||||
|
||||
if (na < nb) {
|
||||
int itmp;
|
||||
BN_ULONG *ltmp;
|
||||
@@ -1140,9 +1024,6 @@ void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, int nb)
|
||||
|
||||
void bn_mul_low_normal(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n)
|
||||
{
|
||||
#ifdef BN_COUNT
|
||||
fprintf(stderr, " bn_mul_low_normal %d * %d\n", n, n);
|
||||
#endif
|
||||
bn_mul_words(r, a, n, b[0]);
|
||||
|
||||
for (;;) {
|
||||
|
||||
Reference in New Issue
Block a user