OpenSSL 1.1.1-pre2
This commit is contained in:
+29
-37
@@ -1,47 +1,29 @@
|
||||
/*
|
||||
* Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 2014-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright (c) 2014, Intel Corporation. All Rights Reserved.
|
||||
* Copyright (c) 2015, CloudFlare, Inc.
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* Originally written by Shay Gueron (1, 2), and Vlad Krasnov (1, 3)
|
||||
* (1) Intel Corporation, Israel Development Center, Haifa, Israel
|
||||
* (2) University of Haifa, Israel
|
||||
* (3) CloudFlare, Inc.
|
||||
*
|
||||
* Reference:
|
||||
* S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with
|
||||
* 256 Bit Primes"
|
||||
*/
|
||||
|
||||
/******************************************************************************
|
||||
* *
|
||||
* Copyright 2014 Intel Corporation *
|
||||
* *
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); *
|
||||
* you may not use this file except in compliance with the License. *
|
||||
* You may obtain a copy of the License at *
|
||||
* *
|
||||
* http://www.apache.org/licenses/LICENSE-2.0 *
|
||||
* *
|
||||
* Unless required by applicable law or agreed to in writing, software *
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, *
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
|
||||
* See the License for the specific language governing permissions and *
|
||||
* limitations under the License. *
|
||||
* *
|
||||
******************************************************************************
|
||||
* *
|
||||
* Developers and authors: *
|
||||
* Shay Gueron (1, 2), and Vlad Krasnov (1) *
|
||||
* (1) Intel Corporation, Israel Development Center *
|
||||
* (2) University of Haifa *
|
||||
* (3) CloudFlare, Inc. *
|
||||
* Reference: *
|
||||
* S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with *
|
||||
* 256 Bit Primes" *
|
||||
* *
|
||||
******************************************************************************/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "internal/cryptlib.h"
|
||||
#include "internal/bn_int.h"
|
||||
#include "ec_lcl.h"
|
||||
#include "internal/refcount.h"
|
||||
|
||||
#if BN_BITS2 != 64
|
||||
# define TOBN(hi,lo) lo,hi
|
||||
@@ -86,7 +68,7 @@ struct nistz256_pre_comp_st {
|
||||
*/
|
||||
PRECOMP256_ROW *precomp;
|
||||
void *precomp_storage;
|
||||
int references;
|
||||
CRYPTO_REF_COUNT references;
|
||||
CRYPTO_RWLOCK *lock;
|
||||
};
|
||||
|
||||
@@ -256,6 +238,16 @@ static BN_ULONG is_one(const BIGNUM *z)
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* For reference, this macro is used only when new ecp_nistz256 assembly
|
||||
* module is being developed. For example, configure with
|
||||
* -DECP_NISTZ256_REFERENCE_IMPLEMENTATION and implement only functions
|
||||
* performing simplest arithmetic operations on 256-bit vectors. Then
|
||||
* work on implementation of higher-level functions performing point
|
||||
* operations. Then remove ECP_NISTZ256_REFERENCE_IMPLEMENTATION
|
||||
* and never define it again. (The correct macro denoting presence of
|
||||
* ecp_nistz256 module is ECP_NISTZ256_ASM.)
|
||||
*/
|
||||
#ifndef ECP_NISTZ256_REFERENCE_IMPLEMENTATION
|
||||
void ecp_nistz256_point_double(P256_POINT *r, const P256_POINT *a);
|
||||
void ecp_nistz256_point_add(P256_POINT *r,
|
||||
@@ -1469,7 +1461,7 @@ NISTZ256_PRE_COMP *EC_nistz256_pre_comp_dup(NISTZ256_PRE_COMP *p)
|
||||
{
|
||||
int i;
|
||||
if (p != NULL)
|
||||
CRYPTO_atomic_add(&p->references, 1, &i, p->lock);
|
||||
CRYPTO_UP_REF(&p->references, &i, p->lock);
|
||||
return p;
|
||||
}
|
||||
|
||||
@@ -1480,7 +1472,7 @@ void EC_nistz256_pre_comp_free(NISTZ256_PRE_COMP *pre)
|
||||
if (pre == NULL)
|
||||
return;
|
||||
|
||||
CRYPTO_atomic_add(&pre->references, -1, &i, pre->lock);
|
||||
CRYPTO_DOWN_REF(&pre->references, &i, pre->lock);
|
||||
REF_PRINT_COUNT("EC_nistz256", x);
|
||||
if (i > 0)
|
||||
return;
|
||||
@@ -1538,6 +1530,10 @@ static int ecp_nistz256_inv_mod_ord(const EC_GROUP *group, BIGNUM *r,
|
||||
BN_ULONG table[15][P256_LIMBS];
|
||||
BN_ULONG out[P256_LIMBS], t[P256_LIMBS];
|
||||
int i, ret = 0;
|
||||
enum {
|
||||
i_1 = 0, i_10, i_11, i_101, i_111, i_1010, i_1111,
|
||||
i_10101, i_101010, i_101111, i_x6, i_x8, i_x16, i_x32
|
||||
};
|
||||
|
||||
/*
|
||||
* Catch allocation failure early.
|
||||
@@ -1615,10 +1611,6 @@ static int ecp_nistz256_inv_mod_ord(const EC_GROUP *group, BIGNUM *r,
|
||||
* multiplications, 25%, on grand scale sign operation is not that
|
||||
* much faster, not more that 2%...
|
||||
*/
|
||||
enum {
|
||||
i_1 = 0, i_10, i_11, i_101, i_111, i_1010, i_1111,
|
||||
i_10101, i_101010, i_101111, i_x6, i_x8, i_x16, i_x32
|
||||
};
|
||||
|
||||
/* pre-calculate powers */
|
||||
ecp_nistz256_ord_sqr_mont(table[i_10], table[i_1], 1);
|
||||
|
||||
Reference in New Issue
Block a user