mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-08-10 07:53:57 +08:00
Merge remote-tracking branch 'origin/master'
# Conflicts: # README.md
This commit is contained in:
@@ -1,63 +1,14 @@
|
||||
/* crypto/bn/bn_nist.c */
|
||||
/*
|
||||
* Written by Nils Larsch for the OpenSSL project
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* 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 above 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 acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED 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 OpenSSL PROJECT OR
|
||||
* ITS 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.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
* Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include "bn_lcl.h"
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
|
||||
#define BN_NIST_192_TOP (192+BN_BITS2-1)/BN_BITS2
|
||||
#define BN_NIST_224_TOP (224+BN_BITS2-1)/BN_BITS2
|
||||
@@ -379,8 +330,8 @@ int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
|
||||
PTR_SIZE_INT mask;
|
||||
static const BIGNUM _bignum_nist_p_192_sqr = {
|
||||
(BN_ULONG *)_nist_p_192_sqr,
|
||||
sizeof(_nist_p_192_sqr) / sizeof(_nist_p_192_sqr[0]),
|
||||
sizeof(_nist_p_192_sqr) / sizeof(_nist_p_192_sqr[0]),
|
||||
OSSL_NELEM(_nist_p_192_sqr),
|
||||
OSSL_NELEM(_nist_p_192_sqr),
|
||||
0, BN_FLG_STATIC_DATA
|
||||
};
|
||||
|
||||
@@ -524,8 +475,8 @@ int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
|
||||
} u;
|
||||
static const BIGNUM _bignum_nist_p_224_sqr = {
|
||||
(BN_ULONG *)_nist_p_224_sqr,
|
||||
sizeof(_nist_p_224_sqr) / sizeof(_nist_p_224_sqr[0]),
|
||||
sizeof(_nist_p_224_sqr) / sizeof(_nist_p_224_sqr[0]),
|
||||
OSSL_NELEM(_nist_p_224_sqr),
|
||||
OSSL_NELEM(_nist_p_224_sqr),
|
||||
0, BN_FLG_STATIC_DATA
|
||||
};
|
||||
|
||||
@@ -645,7 +596,7 @@ int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
|
||||
#endif
|
||||
} else if (carry < 0) {
|
||||
/*
|
||||
* it's a bit more comlicated logic in this case. if bn_add_words
|
||||
* it's a bit more complicated logic in this case. if bn_add_words
|
||||
* yields no carry, then result has to be adjusted by unconditionally
|
||||
* *adding* the modulus. but if it does, then result has to be
|
||||
* compared to the modulus and conditionally adjusted by
|
||||
@@ -705,8 +656,8 @@ int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
|
||||
} u;
|
||||
static const BIGNUM _bignum_nist_p_256_sqr = {
|
||||
(BN_ULONG *)_nist_p_256_sqr,
|
||||
sizeof(_nist_p_256_sqr) / sizeof(_nist_p_256_sqr[0]),
|
||||
sizeof(_nist_p_256_sqr) / sizeof(_nist_p_256_sqr[0]),
|
||||
OSSL_NELEM(_nist_p_256_sqr),
|
||||
OSSL_NELEM(_nist_p_256_sqr),
|
||||
0, BN_FLG_STATIC_DATA
|
||||
};
|
||||
|
||||
@@ -951,8 +902,8 @@ int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
|
||||
} u;
|
||||
static const BIGNUM _bignum_nist_p_384_sqr = {
|
||||
(BN_ULONG *)_nist_p_384_sqr,
|
||||
sizeof(_nist_p_384_sqr) / sizeof(_nist_p_384_sqr[0]),
|
||||
sizeof(_nist_p_384_sqr) / sizeof(_nist_p_384_sqr[0]),
|
||||
OSSL_NELEM(_nist_p_384_sqr),
|
||||
OSSL_NELEM(_nist_p_384_sqr),
|
||||
0, BN_FLG_STATIC_DATA
|
||||
};
|
||||
|
||||
@@ -1209,8 +1160,8 @@ int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
|
||||
PTR_SIZE_INT mask;
|
||||
static const BIGNUM _bignum_nist_p_521_sqr = {
|
||||
(BN_ULONG *)_nist_p_521_sqr,
|
||||
sizeof(_nist_p_521_sqr) / sizeof(_nist_p_521_sqr[0]),
|
||||
sizeof(_nist_p_521_sqr) / sizeof(_nist_p_521_sqr[0]),
|
||||
OSSL_NELEM(_nist_p_521_sqr),
|
||||
OSSL_NELEM(_nist_p_521_sqr),
|
||||
0, BN_FLG_STATIC_DATA
|
||||
};
|
||||
|
||||
@@ -1239,9 +1190,20 @@ int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
|
||||
top - (BN_NIST_521_TOP - 1), BN_NIST_521_TOP);
|
||||
/* ... and right shift */
|
||||
for (val = t_d[0], i = 0; i < BN_NIST_521_TOP - 1; i++) {
|
||||
#if 0
|
||||
/*
|
||||
* MSC ARM compiler [version 2013, presumably even earlier,
|
||||
* much earlier] miscompiles this code, but not one in
|
||||
* #else section. See RT#3541.
|
||||
*/
|
||||
tmp = val >> BN_NIST_521_RSHIFT;
|
||||
val = t_d[i + 1];
|
||||
t_d[i] = (tmp | val << BN_NIST_521_LSHIFT) & BN_MASK2;
|
||||
#else
|
||||
t_d[i] = (val >> BN_NIST_521_RSHIFT |
|
||||
(tmp = t_d[i + 1]) << BN_NIST_521_LSHIFT) & BN_MASK2;
|
||||
val = tmp;
|
||||
#endif
|
||||
}
|
||||
t_d[i] = val >> BN_NIST_521_RSHIFT;
|
||||
/* lower 521 bits */
|
||||
@@ -1260,3 +1222,18 @@ int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int (*BN_nist_mod_func(const BIGNUM *p)) (BIGNUM *r, const BIGNUM *a,
|
||||
const BIGNUM *field, BN_CTX *ctx) {
|
||||
if (BN_ucmp(&_bignum_nist_p_192, p) == 0)
|
||||
return BN_nist_mod_192;
|
||||
if (BN_ucmp(&_bignum_nist_p_224, p) == 0)
|
||||
return BN_nist_mod_224;
|
||||
if (BN_ucmp(&_bignum_nist_p_256, p) == 0)
|
||||
return BN_nist_mod_256;
|
||||
if (BN_ucmp(&_bignum_nist_p_384, p) == 0)
|
||||
return BN_nist_mod_384;
|
||||
if (BN_ucmp(&_bignum_nist_p_521, p) == 0)
|
||||
return BN_nist_mod_521;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user