Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Tom
crown-core
Commits
ecdd15f8
Commit
ecdd15f8
authored
8 years ago
by
infernoman
Browse files
Options
Download
Email Patches
Plain Diff
Update secp256k1 to tree 50cc6ab0625efda6dddf1dc86c1e2671f069b0d8
parent
e42b14ca
Changes
23
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
src/secp256k1/.gitignore
+1
-0
src/secp256k1/.gitignore
src/secp256k1/.travis.yml
+6
-8
src/secp256k1/.travis.yml
src/secp256k1/Makefile.am
+2
-2
src/secp256k1/Makefile.am
src/secp256k1/build-aux/m4/bitcoin_secp.m4
+1
-19
src/secp256k1/build-aux/m4/bitcoin_secp.m4
src/secp256k1/configure.ac
+66
-41
src/secp256k1/configure.ac
src/secp256k1/include/secp256k1.h
+41
-10
src/secp256k1/include/secp256k1.h
src/secp256k1/src/bench_sign.c
+1
-4
src/secp256k1/src/bench_sign.c
src/secp256k1/src/bench_verify.c
+1
-3
src/secp256k1/src/bench_verify.c
src/secp256k1/src/ecdsa_impl.h
+43
-16
src/secp256k1/src/ecdsa_impl.h
src/secp256k1/src/ecmult_gen_impl.h
+1
-1
src/secp256k1/src/ecmult_gen_impl.h
src/secp256k1/src/ecmult_impl.h
+2
-2
src/secp256k1/src/ecmult_impl.h
src/secp256k1/src/field.h
+14
-5
src/secp256k1/src/field.h
src/secp256k1/src/field_10x26_impl.h
+99
-12
src/secp256k1/src/field_10x26_impl.h
src/secp256k1/src/field_5x52_impl.h
+81
-15
src/secp256k1/src/field_5x52_impl.h
src/secp256k1/src/field_gmp.h
+0
-18
src/secp256k1/src/field_gmp.h
src/secp256k1/src/field_gmp_impl.h
+0
-184
src/secp256k1/src/field_gmp_impl.h
src/secp256k1/src/field_impl.h
+9
-7
src/secp256k1/src/field_impl.h
src/secp256k1/src/group.h
+3
-4
src/secp256k1/src/group.h
src/secp256k1/src/group_impl.h
+26
-40
src/secp256k1/src/group_impl.h
src/secp256k1/src/hash.h
+41
-0
src/secp256k1/src/hash.h
with
438 additions
and
391 deletions
+438
-391
src/secp256k1/.gitignore
View file @
ecdd15f8
bench_inv
bench_sign
bench_verify
bench_recover
tests
*.exe
*.so
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/.travis.yml
View file @
ecdd15f8
...
...
@@ -4,24 +4,22 @@ compiler:
-
gcc
install
:
-
sudo apt-get install -qq libssl-dev
-
if [ "$BIGNUM" = "gmp" -o "$BIGNUM" = "auto"
-o "$FIELD" = "gmp"
]; then sudo apt-get install --no-install-recommends --no-upgrade -qq libgmp-dev; fi
-
if [ "$BIGNUM" = "gmp" -o "$BIGNUM" = "auto" ]; then sudo apt-get install --no-install-recommends --no-upgrade -qq libgmp-dev; fi
-
if [ -n "$EXTRAPACKAGES" ]; then sudo apt-get update && sudo apt-get install --no-install-recommends --no-upgrade $EXTRAPACKAGES; fi
env
:
global
:
-
FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no BUILD=check EXTRAFLAGS= HOST= EXTRAPACKAGES=
-
FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no
ASM=no
BUILD=check EXTRAFLAGS= HOST= EXTRAPACKAGES=
matrix
:
-
SCALAR=32bit
-
SCALAR=64bit
-
FIELD=gmp
-
FIELD=gmp ENDOMORPHISM=yes
-
FIELD=64bit_asm
-
FIELD=64bit_asm ENDOMORPHISM=yes
-
FIELD=64bit
-
FIELD=64bit ENDOMORPHISM=yes
-
FIELD=64bit ASM=x86_64
-
FIELD=64bit ENDOMORPHISM=yes ASM=x86_64
-
FIELD=32bit
-
FIELD=32bit ENDOMORPHISM=yes
-
BIGNUM=no
ne
-
BIGNUM=no
ne
ENDOMORPHISM=yes
-
BIGNUM=no
-
BIGNUM=no
ENDOMORPHISM=yes
-
BUILD=distcheck
-
EXTRAFLAGS=CFLAGS=-DDETERMINISTIC
-
HOST=i686-linux-gnu EXTRAPACKAGES="gcc-multilib"
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/Makefile.am
View file @
ecdd15f8
...
...
@@ -33,8 +33,8 @@ noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h
noinst_HEADERS
+=
src/util.h
noinst_HEADERS
+=
src/testrand.h
noinst_HEADERS
+=
src/testrand_impl.h
noinst_HEADERS
+=
src/
field_gmp
.h
noinst_HEADERS
+=
src/
field_gmp
_impl.h
noinst_HEADERS
+=
src/
hash
.h
noinst_HEADERS
+=
src/
hash
_impl.h
noinst_HEADERS
+=
src/field.h
noinst_HEADERS
+=
src/field_impl.h
noinst_HEADERS
+=
src/bench.h
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/build-aux/m4/bitcoin_secp.m4
View file @
ecdd15f8
dnl libsecp25k1 helper checks
AC_DEFUN([SECP_INT128_CHECK],[
has_int128=$ac_cv_type___int128
if test x"$has_int128" != x"yes" && test x"$set_field" = x"64bit"; then
AC_MSG_ERROR([$set_field field support explicitly requested but is not compatible with this host])
fi
if test x"$has_int128" != x"yes" && test x"$set_scalar" = x"64bit"; then
AC_MSG_ERROR([$set_scalar scalar support explicitly requested but is not compatible with this host])
fi
])
dnl
...
...
@@ -18,11 +12,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
__asm__ __volatile__("movq $0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx");
]])],[has_64bit_asm=yes],[has_64bit_asm=no])
AC_MSG_RESULT([$has_64bit_asm])
if test x"$set_field" == x"64bit_asm"; then
if test x"$has_64bit_asm" == x"no"; then
AC_MSG_ERROR([$set_field field support explicitly requested but no x86_64 assembly available])
fi
fi
])
dnl
...
...
@@ -43,7 +32,7 @@ else
)])
LIBS=
fi
if test x"$has_libcrypto" =
=
x"yes" && test x"$has_openssl_ec" = x; then
if test x"$has_libcrypto" = x"yes" && test x"$has_openssl_ec" = x; then
AC_MSG_CHECKING(for EC functions in libcrypto)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <openssl/ec.h>
...
...
@@ -69,11 +58,4 @@ if test x"$has_gmp" != x"yes"; then
CPPFLAGS="$CPPFLAGS_TEMP"
LIBS="$LIBS_TEMP"
fi
if test x"$set_field" = x"gmp" && test x"$has_gmp" != x"yes"; then
AC_MSG_ERROR([$set_field field support explicitly requested but libgmp was not found])
fi
if test x"$set_bignum" = x"gmp" && test x"$has_gmp" != x"yes"; then
AC_MSG_ERROR([$set_bignum field support explicitly requested but libgmp was not found])
fi
])
This diff is collapsed.
Click to expand it.
src/secp256k1/configure.ac
View file @
ecdd15f8
...
...
@@ -6,7 +6,7 @@ AC_CANONICAL_HOST
AH_TOP([#ifndef LIBSECP256K1_CONFIG_H])
AH_TOP([#define LIBSECP256K1_CONFIG_H])
AH_BOTTOM([#endif //LIBSECP256K1_CONFIG_H])
AM_INIT_AUTOMAKE([foreign])
AM_INIT_AUTOMAKE([foreign
subdir-objects
])
LT_INIT
dnl make the compilation flags quiet unless V=1 is used
...
...
@@ -23,7 +23,7 @@ if test "x$CFLAGS" = "x"; then
fi
AC_PROG_CC_C99
if test x"$ac_cv_prog_cc_c99" =
=
x"no"; then
if test x"$ac_cv_prog_cc_c99" = x"no"; then
AC_MSG_ERROR([c99 compiler support required])
fi
...
...
@@ -96,15 +96,18 @@ AC_ARG_ENABLE(endomorphism,
[use_endomorphism=$enableval],
[use_endomorphism=no])
AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=
gmp|
64bit|
64bit_asm|
32bit|auto],
AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],
[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])
AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no
ne
|auto],
AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],
[Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])
AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],
[Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])
AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto]
[Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto])
AC_CHECK_TYPES([__int128])
AC_MSG_CHECKING([for __builtin_expect])
...
...
@@ -113,40 +116,54 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],
[ AC_MSG_RESULT([no])
])
if test x"$req_
field
" = x"auto"; then
if test x"$req_
asm
" = x"auto"; then
SECP_64BIT_ASM_CHECK
if test x"$has_64bit_asm" = x"yes"; then
set_field=64bit_asm
set_asm=x86_64
fi
if test x"$set_asm" = x; then
set_asm=no
fi
else
set_asm=$req_asm
case $set_asm in
x86_64)
SECP_64BIT_ASM_CHECK
if test x"$has_64bit_asm" != x"yes"; then
AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
fi
;;
no)
;;
*)
AC_MSG_ERROR([invalid assembly optimization selection])
;;
esac
fi
if test x"$req_field" = x"auto"; then
if test x"set_asm" = x"x86_64"; then
set_field=64bit
fi
if test x"$set_field" = x; then
SECP_INT128_CHECK
if test x"$has_int128" = x"yes"; then
set_field=64bit
fi
fi
if test x"$set_field" = x; then
SECP_GMP_CHECK
if test x"$has_gmp" = x"yes"; then
set_field=gmp
fi
fi
if test x"$set_field" = x; then
set_field=32bit
fi
else
set_field=$req_field
case $set_field in
64bit_asm)
SECP_64BIT_ASM_CHECK
;;
64bit)
SECP_INT128_CHECK
;;
gmp)
SECP_GMP_CHECK
if test x"$set_asm" != x"x86_64"; then
SECP_INT128_CHECK
if test x"$has_int128" != x"yes"; then
AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])
fi
fi
;;
32bit)
;;
...
...
@@ -157,11 +174,9 @@ else
fi
if test x"$req_scalar" = x"auto"; then
if test x"$set_scalar" = x; then
SECP_INT128_CHECK
if test x"$has_int128" = x"yes"; then
set_scalar=64bit
fi
SECP_INT128_CHECK
if test x"$has_int128" = x"yes"; then
set_scalar=64bit
fi
if test x"$set_scalar" = x; then
set_scalar=32bit
...
...
@@ -171,6 +186,9 @@ else
case $set_scalar in
64bit)
SECP_INT128_CHECK
if test x"$has_int128" != x"yes"; then
AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])
fi
;;
32bit)
;;
...
...
@@ -187,15 +205,18 @@ if test x"$req_bignum" = x"auto"; then
fi
if test x"$set_bignum" = x; then
set_bignum=no
ne
set_bignum=no
fi
else
set_bignum=$req_bignum
case $set_bignum in
gmp)
SECP_GMP_CHECK
if test x"$has_gmp" != x"yes"; then
AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])
fi
;;
no
ne
)
no)
;;
*)
AC_MSG_ERROR([invalid bignum implementation selection])
...
...
@@ -203,20 +224,23 @@ else
esac
fi
# select assembly optimization
case $set_asm in
x86_64)
AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])
;;
no)
;;
*)
AC_MSG_ERROR([invalid assembly optimizations])
;;
esac
# select field implementation
case $set_field in
64bit_asm)
AC_DEFINE(USE_FIELD_5X52_ASM, 1, [Define this symbol to use the assembly version for the 5x52 field implementation])
AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
;;
64bit)
AC_DEFINE(USE_FIELD_5X52_INT128, 1, [Define this symbol to use the __int128 version for the 5x52 field implementation])
AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])
;;
gmp)
AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed])
AC_DEFINE(USE_FIELD_GMP, 1, [Define this symbol to use the FIELD_GMP implementation])
;;
32bit)
AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])
;;
...
...
@@ -233,7 +257,7 @@ gmp)
AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])
AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])
;;
no
ne
)
no)
AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])
AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])
AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])
...
...
@@ -258,7 +282,7 @@ esac
if test x"$use_tests" = x"yes"; then
SECP_OPENSSL_CHECK
if test x"$has_openssl_ec" =
=
x"yes"; then
if test x"$has_openssl_ec" = x"yes"; then
AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])
SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS"
SECP_TEST_LIBS="$CRYPTO_LIBS"
...
...
@@ -272,7 +296,7 @@ if test x"$use_tests" = x"yes"; then
fi
fi
if test
x"$set_field" = x"gmp" || test
x"$set_bignum" = x"gmp"; then
if test x"$set_bignum" = x"gmp"; then
SECP_LIBS="$SECP_LIBS $GMP_LIBS"
SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS"
fi
...
...
@@ -281,9 +305,11 @@ if test x"$use_endomorphism" = x"yes"; then
AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])
fi
AC_MSG_NOTICE([Using assembly optimizations: $set_asm])
AC_MSG_NOTICE([Using field implementation: $set_field])
AC_MSG_NOTICE([Using bignum implementation: $set_bignum])
AC_MSG_NOTICE([Using scalar implementation: $set_scalar])
AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])
AC_CONFIG_HEADERS([src/libsecp256k1-config.h])
AC_CONFIG_FILES([Makefile libsecp256k1.pc])
...
...
@@ -291,7 +317,6 @@ AC_SUBST(SECP_INCLUDES)
AC_SUBST(SECP_LIBS)
AC_SUBST(SECP_TEST_LIBS)
AC_SUBST(SECP_TEST_INCLUDES)
AM_CONDITIONAL([USE_ASM], [test x"$set_field" == x"64bit_asm"])
AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"])
AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"])
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/include/secp256k1.h
View file @
ecdd15f8
...
...
@@ -77,42 +77,73 @@ SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify(
int
pubkeylen
)
SECP256K1_ARG_NONNULL
(
1
)
SECP256K1_ARG_NONNULL
(
2
)
SECP256K1_ARG_NONNULL
(
4
);
/** A pointer to a function to deterministically generate a nonce.
* Returns: 1 if a nonce was succesfully generated. 0 will cause signing to fail.
* In: msg32: the 32-byte message hash being verified (will not be NULL)
* key32: pointer to a 32-byte secret key (will not be NULL)
* attempt: how many iterations we have tried to find a nonce.
* This will almost always be 0, but different attempt values
* are required to result in a different nonce.
* data: Arbitrary data pointer that is passed through.
* Out: nonce32: pointer to a 32-byte array to be filled by the function.
* Except for test cases, this function should compute some cryptographic hash of
* the message, the key and the attempt.
*/
typedef
int
(
*
secp256k1_nonce_function_t
)(
unsigned
char
*
nonce32
,
const
unsigned
char
*
msg32
,
const
unsigned
char
*
key32
,
unsigned
int
attempt
,
const
void
*
data
);
/** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function. */
extern
const
secp256k1_nonce_function_t
secp256k1_nonce_function_rfc6979
;
/** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */
extern
const
secp256k1_nonce_function_t
secp256k1_nonce_function_default
;
/** Create an ECDSA signature.
* Returns: 1: signature created
* 0: nonce
invalid, try another one
* 0:
the
nonce
generation function failed
* In: msg32: the 32-byte message hash being signed (cannot be NULL)
* seckey: pointer to a 32-byte secret key (cannot be NULL, assumed to be valid)
* nonce: pointer to a 32-byte nonce (cannot be NULL, generated with a cryptographic PRNG)
* noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used
* ndata: pointer to arbitrary data used by the nonce generation function (can be NULL)
* Out: sig: pointer to an array where the signature will be placed (cannot be NULL)
* In/Out: siglen: pointer to an int with the length of sig, which will be updated
* to contain the actual signature length (<=72).
* Requires starting using SECP256K1_START_SIGN.
*/
SECP256K1_WARN_UNUSED_RESULT
int
secp256k1_ecdsa_sign
(
int
secp256k1_ecdsa_sign
(
const
unsigned
char
*
msg32
,
unsigned
char
*
sig
,
int
*
siglen
,
const
unsigned
char
*
seckey
,
const
unsigned
char
*
nonce
)
SECP256K1_ARG_NONNULL
(
1
)
SECP256K1_ARG_NONNULL
(
2
)
SECP256K1_ARG_NONNULL
(
3
)
SECP256K1_ARG_NONNULL
(
4
)
SECP256K1_ARG_NONNULL
(
5
);
secp256k1_nonce_function_t
noncefp
,
const
void
*
ndata
)
SECP256K1_ARG_NONNULL
(
1
)
SECP256K1_ARG_NONNULL
(
2
)
SECP256K1_ARG_NONNULL
(
3
)
SECP256K1_ARG_NONNULL
(
4
);
/** Create a compact ECDSA signature (64 byte + recovery id).
* Returns: 1: signature created
* 0: nonce
invalid, try another one
* 0:
the
nonce
generation function failed
* In: msg32: the 32-byte message hash being signed (cannot be NULL)
* seckey: pointer to a 32-byte secret key (cannot be NULL, assumed to be valid)
* nonce: pointer to a 32-byte nonce (cannot be NULL, generated with a cryptographic PRNG)
* noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used
* ndata: pointer to arbitrary data used by the nonce generation function (can be NULL)
* Out: sig: pointer to a 64-byte array where the signature will be placed (cannot be NULL)
* recid: pointer to an int, which will be updated to contain the recovery id (can be NULL)
* Requires starting using SECP256K1_START_SIGN.
*/
SECP256K1_WARN_UNUSED_RESULT
int
secp256k1_ecdsa_sign_compact
(
int
secp256k1_ecdsa_sign_compact
(
const
unsigned
char
*
msg32
,
unsigned
char
*
sig64
,
const
unsigned
char
*
seckey
,
const
unsigned
char
*
nonce
,
secp256k1_nonce_function_t
noncefp
,
const
void
*
ndata
,
int
*
recid
)
SECP256K1_ARG_NONNULL
(
1
)
SECP256K1_ARG_NONNULL
(
2
)
SECP256K1_ARG_NONNULL
(
3
)
SECP256K1_ARG_NONNULL
(
4
)
;
)
SECP256K1_ARG_NONNULL
(
1
)
SECP256K1_ARG_NONNULL
(
2
)
SECP256K1_ARG_NONNULL
(
3
);
/** Recover an ECDSA public key from a compact signature.
* Returns: 1: public key successfully recovered (which guarantees a correct signature).
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/bench_sign.c
View file @
ecdd15f8
...
...
@@ -10,7 +10,6 @@
typedef
struct
{
unsigned
char
msg
[
32
];
unsigned
char
nonce
[
32
];
unsigned
char
key
[
32
];
}
bench_sign_t
;
...
...
@@ -18,7 +17,6 @@ static void bench_sign_setup(void* arg) {
bench_sign_t
*
data
=
(
bench_sign_t
*
)
arg
;
for
(
int
i
=
0
;
i
<
32
;
i
++
)
data
->
msg
[
i
]
=
i
+
1
;
for
(
int
i
=
0
;
i
<
32
;
i
++
)
data
->
nonce
[
i
]
=
i
+
33
;
for
(
int
i
=
0
;
i
<
32
;
i
++
)
data
->
key
[
i
]
=
i
+
65
;
}
...
...
@@ -28,9 +26,8 @@ static void bench_sign(void* arg) {
unsigned
char
sig
[
64
];
for
(
int
i
=
0
;
i
<
20000
;
i
++
)
{
int
recid
=
0
;
CHECK
(
secp256k1_ecdsa_sign_compact
(
data
->
msg
,
sig
,
data
->
key
,
data
->
nonce
,
&
recid
));
CHECK
(
secp256k1_ecdsa_sign_compact
(
data
->
msg
,
sig
,
data
->
key
,
NULL
,
NULL
,
&
recid
));
for
(
int
j
=
0
;
j
<
32
;
j
++
)
{
data
->
nonce
[
j
]
=
data
->
key
[
j
];
/* Move former key to nonce */
data
->
msg
[
j
]
=
sig
[
j
];
/* Move former R to message. */
data
->
key
[
j
]
=
sig
[
j
+
32
];
/* Move former S to key. */
}
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/bench_verify.c
View file @
ecdd15f8
...
...
@@ -14,7 +14,6 @@
typedef
struct
{
unsigned
char
msg
[
32
];
unsigned
char
key
[
32
];
unsigned
char
nonce
[
32
];
unsigned
char
sig
[
72
];
int
siglen
;
unsigned
char
pubkey
[
33
];
...
...
@@ -42,9 +41,8 @@ int main(void) {
for
(
int
i
=
0
;
i
<
32
;
i
++
)
data
.
msg
[
i
]
=
1
+
i
;
for
(
int
i
=
0
;
i
<
32
;
i
++
)
data
.
key
[
i
]
=
33
+
i
;
for
(
int
i
=
0
;
i
<
32
;
i
++
)
data
.
nonce
[
i
]
=
65
+
i
;
data
.
siglen
=
72
;
CHECK
(
secp256k1_ecdsa_sign
(
data
.
msg
,
data
.
sig
,
&
data
.
siglen
,
data
.
key
,
data
.
nonce
)
);
secp256k1_ecdsa_sign
(
data
.
msg
,
data
.
sig
,
&
data
.
siglen
,
data
.
key
,
NULL
,
NULL
);
data
.
pubkeylen
=
33
;
CHECK
(
secp256k1_ec_pubkey_create
(
data
.
pubkey
,
&
data
.
pubkeylen
,
data
.
key
,
1
));
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/ecdsa_impl.h
View file @
ecdd15f8
...
...
@@ -109,25 +109,53 @@ static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const se
return
1
;
}
static
int
secp256k1_ecdsa_sig_
recompute
(
secp256k1_scalar_t
*
r2
,
const
secp256k1_ecdsa_sig_t
*
sig
,
const
secp256k1_ge_t
*
pubkey
,
const
secp256k1_scalar_t
*
message
)
{
static
int
secp256k1_ecdsa_sig_
verify
(
const
secp256k1_ecdsa_sig_t
*
sig
,
const
secp256k1_ge_t
*
pubkey
,
const
secp256k1_scalar_t
*
message
)
{
if
(
secp256k1_scalar_is_zero
(
&
sig
->
r
)
||
secp256k1_scalar_is_zero
(
&
sig
->
s
))
return
0
;
int
ret
=
0
;
secp256k1_scalar_t
sn
,
u1
,
u2
;
secp256k1_scalar_inverse_var
(
&
sn
,
&
sig
->
s
);
secp256k1_scalar_mul
(
&
u1
,
&
sn
,
message
);
secp256k1_scalar_mul
(
&
u2
,
&
sn
,
&
sig
->
r
);
secp256k1_gej_t
pubkeyj
;
secp256k1_gej_set_ge
(
&
pubkeyj
,
pubkey
);
secp256k1_gej_t
pr
;
secp256k1_ecmult
(
&
pr
,
&
pubkeyj
,
&
u2
,
&
u1
);
if
(
!
secp256k1_gej_is_infinity
(
&
pr
))
{
secp256k1_fe_t
xr
;
secp256k1_gej_get_x_var
(
&
xr
,
&
pr
);
secp256k1_fe_normalize_var
(
&
xr
);
unsigned
char
xrb
[
32
];
secp256k1_fe_get_b32
(
xrb
,
&
xr
);
secp256k1_scalar_set_b32
(
r2
,
xrb
,
NULL
);
ret
=
1
;
if
(
secp256k1_gej_is_infinity
(
&
pr
))
{
return
0
;
}
unsigned
char
c
[
32
];
secp256k1_scalar_get_b32
(
c
,
&
sig
->
r
);
secp256k1_fe_t
xr
;
secp256k1_fe_set_b32
(
&
xr
,
c
);
// We now have the recomputed R point in pr, and its claimed x coordinate (modulo n)
// in xr. Naively, we would extract the x coordinate from pr (requiring a inversion modulo p),
// compute the remainder modulo n, and compare it to xr. However:
//
// xr == X(pr) mod n
// <=> exists h. (xr + h * n < p && xr + h * n == X(pr))
// [Since 2 * n > p, h can only be 0 or 1]
// <=> (xr == X(pr)) || (xr + n < p && xr + n == X(pr))
// [In Jacobian coordinates, X(pr) is pr.x / pr.z^2 mod p]
// <=> (xr == pr.x / pr.z^2 mod p) || (xr + n < p && xr + n == pr.x / pr.z^2 mod p)
// [Multiplying both sides of the equations by pr.z^2 mod p]
// <=> (xr * pr.z^2 mod p == pr.x) || (xr + n < p && (xr + n) * pr.z^2 mod p == pr.x)
//
// Thus, we can avoid the inversion, but we have to check both cases separately.
// secp256k1_gej_eq_x implements the (xr * pr.z^2 mod p == pr.x) test.
if
(
secp256k1_gej_eq_x_var
(
&
xr
,
&
pr
))
{
// xr.x == xr * xr.z^2 mod p, so the signature is valid.
return
1
;
}
if
(
secp256k1_fe_cmp_var
(
&
xr
,
&
secp256k1_ecdsa_consts
->
p_minus_order
)
>=
0
)
{
// xr + p >= n, so we can skip testing the second case.
return
0
;
}
secp256k1_fe_add
(
&
xr
,
&
secp256k1_ecdsa_consts
->
order_as_fe
);
if
(
secp256k1_gej_eq_x_var
(
&
xr
,
&
pr
))
{
// (xr + n) * pr.z^2 mod p == pr.x, so the signature is valid.
return
1
;
}
return
ret
;
return
0
;
}
static
int
secp256k1_ecdsa_sig_recover
(
const
secp256k1_ecdsa_sig_t
*
sig
,
secp256k1_ge_t
*
pubkey
,
const
secp256k1_scalar_t
*
message
,
int
recid
)
{
...
...
@@ -159,13 +187,6 @@ static int secp256k1_ecdsa_sig_recover(const secp256k1_ecdsa_sig_t *sig, secp256
return
!
secp256k1_gej_is_infinity
(
&
qj
);
}
static
int
secp256k1_ecdsa_sig_verify
(
const
secp256k1_ecdsa_sig_t
*
sig
,
const
secp256k1_ge_t
*
pubkey
,
const
secp256k1_scalar_t
*
message
)
{
secp256k1_scalar_t
r2
;
int
ret
=
0
;
ret
=
secp256k1_ecdsa_sig_recompute
(
&
r2
,
sig
,
pubkey
,
message
)
&&
secp256k1_scalar_eq
(
&
sig
->
r
,
&
r2
);
return
ret
;
}
static
int
secp256k1_ecdsa_sig_sign
(
secp256k1_ecdsa_sig_t
*
sig
,
const
secp256k1_scalar_t
*
seckey
,
const
secp256k1_scalar_t
*
message
,
const
secp256k1_scalar_t
*
nonce
,
int
*
recid
)
{
secp256k1_gej_t
rp
;
secp256k1_ecmult_gen
(
&
rp
,
nonce
);
...
...
@@ -177,6 +198,12 @@ static int secp256k1_ecdsa_sig_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_
secp256k1_fe_get_b32
(
b
,
&
r
.
x
);
int
overflow
=
0
;
secp256k1_scalar_set_b32
(
&
sig
->
r
,
b
,
&
overflow
);
if
(
secp256k1_scalar_is_zero
(
&
sig
->
r
))
{
/* P.x = order is on the curve, so technically sig->r could end up zero, which would be an invalid signature. */
secp256k1_gej_clear
(
&
rp
);
secp256k1_ge_clear
(
&
r
);
return
0
;
}
if
(
recid
)
*
recid
=
(
overflow
?
2
:
0
)
|
(
secp256k1_fe_is_odd
(
&
r
.
y
)
?
1
:
0
);
secp256k1_scalar_t
n
;
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/ecmult_gen_impl.h
View file @
ecdd15f8
...
...
@@ -73,7 +73,7 @@ static void secp256k1_ecmult_gen_start(void) {
secp256k1_gej_double_var
(
&
numsbase
,
&
numsbase
);
if
(
j
==
62
)
{
/* In the last iteration, numsbase is (1 - 2^j) * nums instead. */
secp256k1_gej_neg
_var
(
&
numsbase
,
&
numsbase
);
secp256k1_gej_neg
(
&
numsbase
,
&
numsbase
);
secp256k1_gej_add_var
(
&
numsbase
,
&
numsbase
,
&
nums_gej
);
}
}
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/ecmult_impl.h
View file @
ecdd15f8
...
...
@@ -70,8 +70,8 @@ static void secp256k1_ecmult_table_precomp_ge_var(secp256k1_ge_t *pre, const sec
(neg)((r), &(pre)[(-(n)-1)/2]); \
} while(0)
#define ECMULT_TABLE_GET_GEJ(r,pre,n,w) ECMULT_TABLE_GET((r),(pre),(n),(w),secp256k1_gej_neg
_var
)
#define ECMULT_TABLE_GET_GE(r,pre,n,w) ECMULT_TABLE_GET((r),(pre),(n),(w),secp256k1_ge_neg
_var
)
#define ECMULT_TABLE_GET_GEJ(r,pre,n,w) ECMULT_TABLE_GET((r),(pre),(n),(w),secp256k1_gej_neg)
#define ECMULT_TABLE_GET_GE(r,pre,n,w) ECMULT_TABLE_GET((r),(pre),(n),(w),secp256k1_ge_neg)
typedef
struct
{
/* For accelerating the computation of a*P + b*G: */
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/field.h
View file @
ecdd15f8
...
...
@@ -22,9 +22,7 @@
#include "libsecp256k1-config.h"
#endif
#if defined(USE_FIELD_GMP)
#include "field_gmp.h"
#elif defined(USE_FIELD_10X26)
#if defined(USE_FIELD_10X26)
#include "field_10x26.h"
#elif defined(USE_FIELD_5X52)
#include "field_5x52.h"
...
...
@@ -50,9 +48,20 @@ static void secp256k1_fe_stop(void);
/** Normalize a field element. */
static
void
secp256k1_fe_normalize
(
secp256k1_fe_t
*
r
);
/** Weakly normalize a field element: reduce it magnitude to 1, but don't fully normalize. */
static
void
secp256k1_fe_normalize_weak
(
secp256k1_fe_t
*
r
);
/** Normalize a field element, without constant-time guarantee. */
static
void
secp256k1_fe_normalize_var
(
secp256k1_fe_t
*
r
);
/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field
* implementation may optionally normalize the input, but this should not be relied upon. */
static
int
secp256k1_fe_normalizes_to_zero
(
secp256k1_fe_t
*
r
);
/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field
* implementation may optionally normalize the input, but this should not be relied upon. */
static
int
secp256k1_fe_normalizes_to_zero_var
(
secp256k1_fe_t
*
r
);
/** Set a field element equal to a small integer. Resulting field element is normalized. */
static
void
secp256k1_fe_set_int
(
secp256k1_fe_t
*
r
,
int
a
);
...
...
@@ -62,8 +71,8 @@ static int secp256k1_fe_is_zero(const secp256k1_fe_t *a);
/** Check the "oddness" of a field element. Requires the input to be normalized. */
static
int
secp256k1_fe_is_odd
(
const
secp256k1_fe_t
*
a
);
/** Compare two field elements. Requires
both inputs to be normalized
*/
static
int
secp256k1_fe_equal
(
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
b
);
/** Compare two field elements. Requires
magnitude-1 inputs.
*/
static
int
secp256k1_fe_equal
_var
(
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
b
);
/** Compare two field elements. Requires both inputs to be normalized */
static
int
secp256k1_fe_cmp_var
(
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
b
);
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/field_10x26_impl.h
View file @
ecdd15f8
...
...
@@ -31,6 +31,7 @@ static void secp256k1_fe_verify(const secp256k1_fe_t *a) {
r
&=
(
d
[
8
]
<=
0x3FFFFFFUL
*
m
);
r
&=
(
d
[
9
]
<=
0x03FFFFFUL
*
m
);
r
&=
(
a
->
magnitude
>=
0
);
r
&=
(
a
->
magnitude
<=
32
);
if
(
a
->
normalized
)
{
r
&=
(
a
->
magnitude
<=
1
);
if
(
r
&&
(
d
[
9
]
==
0x03FFFFFUL
))
{
...
...
@@ -103,6 +104,37 @@ static void secp256k1_fe_normalize(secp256k1_fe_t *r) {
#endif
}
static
void
secp256k1_fe_normalize_weak
(
secp256k1_fe_t
*
r
)
{
uint32_t
t0
=
r
->
n
[
0
],
t1
=
r
->
n
[
1
],
t2
=
r
->
n
[
2
],
t3
=
r
->
n
[
3
],
t4
=
r
->
n
[
4
],
t5
=
r
->
n
[
5
],
t6
=
r
->
n
[
6
],
t7
=
r
->
n
[
7
],
t8
=
r
->
n
[
8
],
t9
=
r
->
n
[
9
];
/* Reduce t9 at the start so there will be at most a single carry from the first pass */
uint32_t
x
=
t9
>>
22
;
t9
&=
0x03FFFFFUL
;
/* The first pass ensures the magnitude is 1, ... */
t0
+=
x
*
0x3D1UL
;
t1
+=
(
x
<<
6
);
t1
+=
(
t0
>>
26
);
t0
&=
0x3FFFFFFUL
;
t2
+=
(
t1
>>
26
);
t1
&=
0x3FFFFFFUL
;
t3
+=
(
t2
>>
26
);
t2
&=
0x3FFFFFFUL
;
t4
+=
(
t3
>>
26
);
t3
&=
0x3FFFFFFUL
;
t5
+=
(
t4
>>
26
);
t4
&=
0x3FFFFFFUL
;
t6
+=
(
t5
>>
26
);
t5
&=
0x3FFFFFFUL
;
t7
+=
(
t6
>>
26
);
t6
&=
0x3FFFFFFUL
;
t8
+=
(
t7
>>
26
);
t7
&=
0x3FFFFFFUL
;
t9
+=
(
t8
>>
26
);
t8
&=
0x3FFFFFFUL
;
/* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */
VERIFY_CHECK
(
t9
>>
23
==
0
);
r
->
n
[
0
]
=
t0
;
r
->
n
[
1
]
=
t1
;
r
->
n
[
2
]
=
t2
;
r
->
n
[
3
]
=
t3
;
r
->
n
[
4
]
=
t4
;
r
->
n
[
5
]
=
t5
;
r
->
n
[
6
]
=
t6
;
r
->
n
[
7
]
=
t7
;
r
->
n
[
8
]
=
t8
;
r
->
n
[
9
]
=
t9
;
#ifdef VERIFY
r
->
magnitude
=
1
;
secp256k1_fe_verify
(
r
);
#endif
}
static
void
secp256k1_fe_normalize_var
(
secp256k1_fe_t
*
r
)
{
uint32_t
t0
=
r
->
n
[
0
],
t1
=
r
->
n
[
1
],
t2
=
r
->
n
[
2
],
t3
=
r
->
n
[
3
],
t4
=
r
->
n
[
4
],
t5
=
r
->
n
[
5
],
t6
=
r
->
n
[
6
],
t7
=
r
->
n
[
7
],
t8
=
r
->
n
[
8
],
t9
=
r
->
n
[
9
];
...
...
@@ -159,6 +191,73 @@ static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) {
#endif
}
static
int
secp256k1_fe_normalizes_to_zero
(
secp256k1_fe_t
*
r
)
{
uint32_t
t0
=
r
->
n
[
0
],
t1
=
r
->
n
[
1
],
t2
=
r
->
n
[
2
],
t3
=
r
->
n
[
3
],
t4
=
r
->
n
[
4
],
t5
=
r
->
n
[
5
],
t6
=
r
->
n
[
6
],
t7
=
r
->
n
[
7
],
t8
=
r
->
n
[
8
],
t9
=
r
->
n
[
9
];
/* Reduce t9 at the start so there will be at most a single carry from the first pass */
uint32_t
x
=
t9
>>
22
;
t9
&=
0x03FFFFFUL
;
/* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */
uint32_t
z0
,
z1
;
/* The first pass ensures the magnitude is 1, ... */
t0
+=
x
*
0x3D1UL
;
t1
+=
(
x
<<
6
);
t1
+=
(
t0
>>
26
);
t0
&=
0x3FFFFFFUL
;
z0
=
t0
;
z1
=
t0
^
0x3D0UL
;
t2
+=
(
t1
>>
26
);
t1
&=
0x3FFFFFFUL
;
z0
|=
t1
;
z1
&=
t1
^
0x40UL
;
t3
+=
(
t2
>>
26
);
t2
&=
0x3FFFFFFUL
;
z0
|=
t2
;
z1
&=
t2
;
t4
+=
(
t3
>>
26
);
t3
&=
0x3FFFFFFUL
;
z0
|=
t3
;
z1
&=
t3
;
t5
+=
(
t4
>>
26
);
t4
&=
0x3FFFFFFUL
;
z0
|=
t4
;
z1
&=
t4
;
t6
+=
(
t5
>>
26
);
t5
&=
0x3FFFFFFUL
;
z0
|=
t5
;
z1
&=
t5
;
t7
+=
(
t6
>>
26
);
t6
&=
0x3FFFFFFUL
;
z0
|=
t6
;
z1
&=
t6
;
t8
+=
(
t7
>>
26
);
t7
&=
0x3FFFFFFUL
;
z0
|=
t7
;
z1
&=
t7
;
t9
+=
(
t8
>>
26
);
t8
&=
0x3FFFFFFUL
;
z0
|=
t8
;
z1
&=
t8
;
z0
|=
t9
;
z1
&=
t9
^
0x3C00000UL
;
/* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */
VERIFY_CHECK
(
t9
>>
23
==
0
);
return
(
z0
==
0
)
|
(
z1
==
0x3FFFFFFUL
);
}
static
int
secp256k1_fe_normalizes_to_zero_var
(
secp256k1_fe_t
*
r
)
{
uint32_t
t0
=
r
->
n
[
0
],
t9
=
r
->
n
[
9
];
/* Reduce t9 at the start so there will be at most a single carry from the first pass */
uint32_t
x
=
t9
>>
22
;
/* The first pass ensures the magnitude is 1, ... */
t0
+=
x
*
0x3D1UL
;
/* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */
uint32_t
z0
=
t0
&
0x3FFFFFFUL
,
z1
=
z0
^
0x3D0UL
;
/* Fast return path should catch the majority of cases */
if
((
z0
!=
0UL
)
&
(
z1
!=
0x3FFFFFFUL
))
return
0
;
uint32_t
t1
=
r
->
n
[
1
],
t2
=
r
->
n
[
2
],
t3
=
r
->
n
[
3
],
t4
=
r
->
n
[
4
],
t5
=
r
->
n
[
5
],
t6
=
r
->
n
[
6
],
t7
=
r
->
n
[
7
],
t8
=
r
->
n
[
8
];
t9
&=
0x03FFFFFUL
;
t1
+=
(
x
<<
6
);
t1
+=
(
t0
>>
26
);
t0
=
z0
;
t2
+=
(
t1
>>
26
);
t1
&=
0x3FFFFFFUL
;
z0
|=
t1
;
z1
&=
t1
^
0x40UL
;
t3
+=
(
t2
>>
26
);
t2
&=
0x3FFFFFFUL
;
z0
|=
t2
;
z1
&=
t2
;
t4
+=
(
t3
>>
26
);
t3
&=
0x3FFFFFFUL
;
z0
|=
t3
;
z1
&=
t3
;
t5
+=
(
t4
>>
26
);
t4
&=
0x3FFFFFFUL
;
z0
|=
t4
;
z1
&=
t4
;
t6
+=
(
t5
>>
26
);
t5
&=
0x3FFFFFFUL
;
z0
|=
t5
;
z1
&=
t5
;
t7
+=
(
t6
>>
26
);
t6
&=
0x3FFFFFFUL
;
z0
|=
t6
;
z1
&=
t6
;
t8
+=
(
t7
>>
26
);
t7
&=
0x3FFFFFFUL
;
z0
|=
t7
;
z1
&=
t7
;
t9
+=
(
t8
>>
26
);
t8
&=
0x3FFFFFFUL
;
z0
|=
t8
;
z1
&=
t8
;
z0
|=
t9
;
z1
&=
t9
^
0x3C00000UL
;
/* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */
VERIFY_CHECK
(
t9
>>
23
==
0
);
return
(
z0
==
0
)
|
(
z1
==
0x3FFFFFFUL
);
}
SECP256K1_INLINE
static
void
secp256k1_fe_set_int
(
secp256k1_fe_t
*
r
,
int
a
)
{
r
->
n
[
0
]
=
a
;
r
->
n
[
1
]
=
r
->
n
[
2
]
=
r
->
n
[
3
]
=
r
->
n
[
4
]
=
r
->
n
[
5
]
=
r
->
n
[
6
]
=
r
->
n
[
7
]
=
r
->
n
[
8
]
=
r
->
n
[
9
]
=
0
;
...
...
@@ -196,18 +295,6 @@ SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) {
}
}
SECP256K1_INLINE
static
int
secp256k1_fe_equal
(
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
b
)
{
#ifdef VERIFY
VERIFY_CHECK
(
a
->
normalized
);
VERIFY_CHECK
(
b
->
normalized
);
secp256k1_fe_verify
(
a
);
secp256k1_fe_verify
(
b
);
#endif
const
uint32_t
*
t
=
a
->
n
,
*
u
=
b
->
n
;
return
((
t
[
0
]
^
u
[
0
])
|
(
t
[
1
]
^
u
[
1
])
|
(
t
[
2
]
^
u
[
2
])
|
(
t
[
3
]
^
u
[
3
])
|
(
t
[
4
]
^
u
[
4
])
|
(
t
[
5
]
^
u
[
5
])
|
(
t
[
6
]
^
u
[
6
])
|
(
t
[
7
]
^
u
[
7
])
|
(
t
[
8
]
^
u
[
8
])
|
(
t
[
9
]
^
u
[
9
]))
==
0
;
}
static
int
secp256k1_fe_cmp_var
(
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
b
)
{
#ifdef VERIFY
VERIFY_CHECK
(
a
->
normalized
);
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/field_5x52_impl.h
View file @
ecdd15f8
...
...
@@ -16,12 +16,10 @@
#include "num.h"
#include "field.h"
#if defined(USE_
FIELD_5X52_ASM
)
#if defined(USE_
ASM_X86_64
)
#include "field_5x52_asm_impl.h"
#elif defined(USE_FIELD_5X52_INT128)
#include "field_5x52_int128_impl.h"
#else
#
error "Please select field_5x52 implementation
"
#
include "field_5x52_int128_impl.h
"
#endif
/** Implements arithmetic modulo FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F,
...
...
@@ -45,6 +43,7 @@ static void secp256k1_fe_verify(const secp256k1_fe_t *a) {
r
&=
(
d
[
3
]
<=
0xFFFFFFFFFFFFFULL
*
m
);
r
&=
(
d
[
4
]
<=
0x0FFFFFFFFFFFFULL
*
m
);
r
&=
(
a
->
magnitude
>=
0
);
r
&=
(
a
->
magnitude
<=
2048
);
if
(
a
->
normalized
)
{
r
&=
(
a
->
magnitude
<=
1
);
if
(
r
&&
(
d
[
4
]
==
0x0FFFFFFFFFFFFULL
)
&&
((
d
[
3
]
&
d
[
2
]
&
d
[
1
])
==
0xFFFFFFFFFFFFFULL
))
{
...
...
@@ -102,6 +101,30 @@ static void secp256k1_fe_normalize(secp256k1_fe_t *r) {
#endif
}
static
void
secp256k1_fe_normalize_weak
(
secp256k1_fe_t
*
r
)
{
uint64_t
t0
=
r
->
n
[
0
],
t1
=
r
->
n
[
1
],
t2
=
r
->
n
[
2
],
t3
=
r
->
n
[
3
],
t4
=
r
->
n
[
4
];
/* Reduce t4 at the start so there will be at most a single carry from the first pass */
uint64_t
x
=
t4
>>
48
;
t4
&=
0x0FFFFFFFFFFFFULL
;
/* The first pass ensures the magnitude is 1, ... */
t0
+=
x
*
0x1000003D1ULL
;
t1
+=
(
t0
>>
52
);
t0
&=
0xFFFFFFFFFFFFFULL
;
t2
+=
(
t1
>>
52
);
t1
&=
0xFFFFFFFFFFFFFULL
;
t3
+=
(
t2
>>
52
);
t2
&=
0xFFFFFFFFFFFFFULL
;
t4
+=
(
t3
>>
52
);
t3
&=
0xFFFFFFFFFFFFFULL
;
/* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */
VERIFY_CHECK
(
t4
>>
49
==
0
);
r
->
n
[
0
]
=
t0
;
r
->
n
[
1
]
=
t1
;
r
->
n
[
2
]
=
t2
;
r
->
n
[
3
]
=
t3
;
r
->
n
[
4
]
=
t4
;
#ifdef VERIFY
r
->
magnitude
=
1
;
secp256k1_fe_verify
(
r
);
#endif
}
static
void
secp256k1_fe_normalize_var
(
secp256k1_fe_t
*
r
)
{
uint64_t
t0
=
r
->
n
[
0
],
t1
=
r
->
n
[
1
],
t2
=
r
->
n
[
2
],
t3
=
r
->
n
[
3
],
t4
=
r
->
n
[
4
];
...
...
@@ -146,6 +169,60 @@ static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) {
#endif
}
static
int
secp256k1_fe_normalizes_to_zero
(
secp256k1_fe_t
*
r
)
{
uint64_t
t0
=
r
->
n
[
0
],
t1
=
r
->
n
[
1
],
t2
=
r
->
n
[
2
],
t3
=
r
->
n
[
3
],
t4
=
r
->
n
[
4
];
/* Reduce t4 at the start so there will be at most a single carry from the first pass */
uint64_t
x
=
t4
>>
48
;
t4
&=
0x0FFFFFFFFFFFFULL
;
/* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */
uint64_t
z0
,
z1
;
/* The first pass ensures the magnitude is 1, ... */
t0
+=
x
*
0x1000003D1ULL
;
t1
+=
(
t0
>>
52
);
t0
&=
0xFFFFFFFFFFFFFULL
;
z0
=
t0
;
z1
=
t0
^
0x1000003D0ULL
;
t2
+=
(
t1
>>
52
);
t1
&=
0xFFFFFFFFFFFFFULL
;
z0
|=
t1
;
z1
&=
t1
;
t3
+=
(
t2
>>
52
);
t2
&=
0xFFFFFFFFFFFFFULL
;
z0
|=
t2
;
z1
&=
t2
;
t4
+=
(
t3
>>
52
);
t3
&=
0xFFFFFFFFFFFFFULL
;
z0
|=
t3
;
z1
&=
t3
;
z0
|=
t4
;
z1
&=
t4
^
0xF000000000000ULL
;
/* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */
VERIFY_CHECK
(
t4
>>
49
==
0
);
return
(
z0
==
0
)
|
(
z1
==
0xFFFFFFFFFFFFFULL
);
}
static
int
secp256k1_fe_normalizes_to_zero_var
(
secp256k1_fe_t
*
r
)
{
uint64_t
t0
=
r
->
n
[
0
],
t4
=
r
->
n
[
4
];
/* Reduce t4 at the start so there will be at most a single carry from the first pass */
uint64_t
x
=
t4
>>
48
;
/* The first pass ensures the magnitude is 1, ... */
t0
+=
x
*
0x1000003D1ULL
;
/* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */
uint64_t
z0
=
t0
&
0xFFFFFFFFFFFFFULL
,
z1
=
z0
^
0x1000003D0ULL
;
/* Fast return path should catch the majority of cases */
if
((
z0
!=
0ULL
)
&
(
z1
!=
0xFFFFFFFFFFFFFULL
))
return
0
;
uint64_t
t1
=
r
->
n
[
1
],
t2
=
r
->
n
[
2
],
t3
=
r
->
n
[
3
];
t4
&=
0x0FFFFFFFFFFFFULL
;
t1
+=
(
t0
>>
52
);
t0
=
z0
;
t2
+=
(
t1
>>
52
);
t1
&=
0xFFFFFFFFFFFFFULL
;
z0
|=
t1
;
z1
&=
t1
;
t3
+=
(
t2
>>
52
);
t2
&=
0xFFFFFFFFFFFFFULL
;
z0
|=
t2
;
z1
&=
t2
;
t4
+=
(
t3
>>
52
);
t3
&=
0xFFFFFFFFFFFFFULL
;
z0
|=
t3
;
z1
&=
t3
;
z0
|=
t4
;
z1
&=
t4
^
0xF000000000000ULL
;
/* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */
VERIFY_CHECK
(
t4
>>
49
==
0
);
return
(
z0
==
0
)
|
(
z1
==
0xFFFFFFFFFFFFFULL
);
}
SECP256K1_INLINE
static
void
secp256k1_fe_set_int
(
secp256k1_fe_t
*
r
,
int
a
)
{
r
->
n
[
0
]
=
a
;
r
->
n
[
1
]
=
r
->
n
[
2
]
=
r
->
n
[
3
]
=
r
->
n
[
4
]
=
0
;
...
...
@@ -183,17 +260,6 @@ SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) {
}
}
SECP256K1_INLINE
static
int
secp256k1_fe_equal
(
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
b
)
{
#ifdef VERIFY
VERIFY_CHECK
(
a
->
normalized
);
VERIFY_CHECK
(
b
->
normalized
);
secp256k1_fe_verify
(
a
);
secp256k1_fe_verify
(
b
);
#endif
const
uint64_t
*
t
=
a
->
n
,
*
u
=
b
->
n
;
return
((
t
[
0
]
^
u
[
0
])
|
(
t
[
1
]
^
u
[
1
])
|
(
t
[
2
]
^
u
[
2
])
|
(
t
[
3
]
^
u
[
3
])
|
(
t
[
4
]
^
u
[
4
]))
==
0
;
}
static
int
secp256k1_fe_cmp_var
(
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
b
)
{
#ifdef VERIFY
VERIFY_CHECK
(
a
->
normalized
);
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/field_gmp.h
deleted
100644 → 0
View file @
e42b14ca
/**********************************************************************
* Copyright (c) 2013, 2014 Pieter Wuille *
* Distributed under the MIT software license, see the accompanying *
* file COPYING or http://www.opensource.org/licenses/mit-license.php.*
**********************************************************************/
#ifndef _SECP256K1_FIELD_REPR_
#define _SECP256K1_FIELD_REPR_
#include <gmp.h>
#define FIELD_LIMBS ((256 + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS)
typedef
struct
{
mp_limb_t
n
[
FIELD_LIMBS
+
1
];
}
secp256k1_fe_t
;
#endif
This diff is collapsed.
Click to expand it.
src/secp256k1/src/field_gmp_impl.h
deleted
100644 → 0
View file @
e42b14ca
/**********************************************************************
* Copyright (c) 2013, 2014 Pieter Wuille *
* Distributed under the MIT software license, see the accompanying *
* file COPYING or http://www.opensource.org/licenses/mit-license.php.*
**********************************************************************/
#ifndef _SECP256K1_FIELD_REPR_IMPL_H_
#define _SECP256K1_FIELD_REPR_IMPL_H_
#include <stdio.h>
#include <string.h>
#include "num.h"
#include "field.h"
static
mp_limb_t
secp256k1_field_p
[
FIELD_LIMBS
];
static
mp_limb_t
secp256k1_field_pc
[(
33
+
GMP_NUMB_BITS
-
1
)
/
GMP_NUMB_BITS
];
static
void
secp256k1_fe_inner_start
(
void
)
{
for
(
int
i
=
0
;
i
<
(
33
+
GMP_NUMB_BITS
-
1
)
/
GMP_NUMB_BITS
;
i
++
)
secp256k1_field_pc
[
i
]
=
0
;
secp256k1_field_pc
[
0
]
+=
0x3D1UL
;
secp256k1_field_pc
[
32
/
GMP_NUMB_BITS
]
+=
(((
mp_limb_t
)
1
)
<<
(
32
%
GMP_NUMB_BITS
));
for
(
int
i
=
0
;
i
<
FIELD_LIMBS
;
i
++
)
{
secp256k1_field_p
[
i
]
=
0
;
}
mpn_sub
(
secp256k1_field_p
,
secp256k1_field_p
,
FIELD_LIMBS
,
secp256k1_field_pc
,
(
33
+
GMP_NUMB_BITS
-
1
)
/
GMP_NUMB_BITS
);
}
static
void
secp256k1_fe_inner_stop
(
void
)
{
}
static
void
secp256k1_fe_normalize
(
secp256k1_fe_t
*
r
)
{
if
(
r
->
n
[
FIELD_LIMBS
]
!=
0
)
{
#if (GMP_NUMB_BITS >= 40)
mp_limb_t
carry
=
mpn_add_1
(
r
->
n
,
r
->
n
,
FIELD_LIMBS
,
0x1000003D1ULL
*
r
->
n
[
FIELD_LIMBS
]);
mpn_add_1
(
r
->
n
,
r
->
n
,
FIELD_LIMBS
,
0x1000003D1ULL
*
carry
);
#else
mp_limb_t
carry
=
mpn_add_1
(
r
->
n
,
r
->
n
,
FIELD_LIMBS
,
0x3D1UL
*
r
->
n
[
FIELD_LIMBS
])
+
mpn_add_1
(
r
->
n
+
(
32
/
GMP_NUMB_BITS
),
r
->
n
+
(
32
/
GMP_NUMB_BITS
),
FIELD_LIMBS
-
(
32
/
GMP_NUMB_BITS
),
r
->
n
[
FIELD_LIMBS
]
<<
(
32
%
GMP_NUMB_BITS
));
mpn_add_1
(
r
->
n
,
r
->
n
,
FIELD_LIMBS
,
0x3D1UL
*
carry
);
mpn_add_1
(
r
->
n
+
(
32
/
GMP_NUMB_BITS
),
r
->
n
+
(
32
/
GMP_NUMB_BITS
),
FIELD_LIMBS
-
(
32
/
GMP_NUMB_BITS
),
carry
<<
(
32
%
GMP_NUMB_BITS
));
#endif
r
->
n
[
FIELD_LIMBS
]
=
0
;
}
if
(
mpn_cmp
(
r
->
n
,
secp256k1_field_p
,
FIELD_LIMBS
)
>=
0
)
mpn_sub
(
r
->
n
,
r
->
n
,
FIELD_LIMBS
,
secp256k1_field_p
,
FIELD_LIMBS
);
}
static
void
secp256k1_fe_normalize_var
(
secp256k1_fe_t
*
r
)
{
secp256k1_fe_normalize
(
r
);
}
SECP256K1_INLINE
static
void
secp256k1_fe_set_int
(
secp256k1_fe_t
*
r
,
int
a
)
{
r
->
n
[
0
]
=
a
;
for
(
int
i
=
1
;
i
<
FIELD_LIMBS
+
1
;
i
++
)
r
->
n
[
i
]
=
0
;
}
SECP256K1_INLINE
static
void
secp256k1_fe_clear
(
secp256k1_fe_t
*
r
)
{
for
(
int
i
=
0
;
i
<
FIELD_LIMBS
+
1
;
i
++
)
r
->
n
[
i
]
=
0
;
}
SECP256K1_INLINE
static
int
secp256k1_fe_is_zero
(
const
secp256k1_fe_t
*
a
)
{
int
ret
=
1
;
for
(
int
i
=
0
;
i
<
FIELD_LIMBS
+
1
;
i
++
)
ret
&=
(
a
->
n
[
i
]
==
0
);
return
ret
;
}
SECP256K1_INLINE
static
int
secp256k1_fe_is_odd
(
const
secp256k1_fe_t
*
a
)
{
return
a
->
n
[
0
]
&
1
;
}
SECP256K1_INLINE
static
int
secp256k1_fe_equal
(
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
b
)
{
int
ret
=
1
;
for
(
int
i
=
0
;
i
<
FIELD_LIMBS
+
1
;
i
++
)
ret
&=
(
a
->
n
[
i
]
==
b
->
n
[
i
]);
return
ret
;
}
SECP256K1_INLINE
static
int
secp256k1_fe_cmp_var
(
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
b
)
{
for
(
int
i
=
FIELD_LIMBS
;
i
>=
0
;
i
--
)
{
if
(
a
->
n
[
i
]
>
b
->
n
[
i
])
return
1
;
if
(
a
->
n
[
i
]
<
b
->
n
[
i
])
return
-
1
;
}
return
0
;
}
static
int
secp256k1_fe_set_b32
(
secp256k1_fe_t
*
r
,
const
unsigned
char
*
a
)
{
for
(
int
i
=
0
;
i
<
FIELD_LIMBS
+
1
;
i
++
)
r
->
n
[
i
]
=
0
;
for
(
int
i
=
0
;
i
<
256
;
i
++
)
{
int
limb
=
i
/
GMP_NUMB_BITS
;
int
shift
=
i
%
GMP_NUMB_BITS
;
r
->
n
[
limb
]
|=
(
mp_limb_t
)((
a
[
31
-
i
/
8
]
>>
(
i
%
8
))
&
0x1
)
<<
shift
;
}
return
(
mpn_cmp
(
r
->
n
,
secp256k1_field_p
,
FIELD_LIMBS
)
<
0
);
}
/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */
static
void
secp256k1_fe_get_b32
(
unsigned
char
*
r
,
const
secp256k1_fe_t
*
a
)
{
for
(
int
i
=
0
;
i
<
32
;
i
++
)
{
int
c
=
0
;
for
(
int
j
=
0
;
j
<
8
;
j
++
)
{
int
limb
=
(
8
*
i
+
j
)
/
GMP_NUMB_BITS
;
int
shift
=
(
8
*
i
+
j
)
%
GMP_NUMB_BITS
;
c
|=
((
a
->
n
[
limb
]
>>
shift
)
&
0x1
)
<<
j
;
}
r
[
31
-
i
]
=
c
;
}
}
SECP256K1_INLINE
static
void
secp256k1_fe_negate
(
secp256k1_fe_t
*
r
,
const
secp256k1_fe_t
*
a
,
int
m
)
{
(
void
)
m
;
*
r
=
*
a
;
secp256k1_fe_normalize
(
r
);
for
(
int
i
=
0
;
i
<
FIELD_LIMBS
;
i
++
)
r
->
n
[
i
]
=
~
(
r
->
n
[
i
]);
#if (GMP_NUMB_BITS >= 33)
mpn_sub_1
(
r
->
n
,
r
->
n
,
FIELD_LIMBS
,
0x1000003D0ULL
);
#else
mpn_sub_1
(
r
->
n
,
r
->
n
,
FIELD_LIMBS
,
0x3D0UL
);
mpn_sub_1
(
r
->
n
+
(
32
/
GMP_NUMB_BITS
),
r
->
n
+
(
32
/
GMP_NUMB_BITS
),
FIELD_LIMBS
-
(
32
/
GMP_NUMB_BITS
),
0x1UL
<<
(
32
%
GMP_NUMB_BITS
));
#endif
}
SECP256K1_INLINE
static
void
secp256k1_fe_mul_int
(
secp256k1_fe_t
*
r
,
int
a
)
{
mpn_mul_1
(
r
->
n
,
r
->
n
,
FIELD_LIMBS
+
1
,
a
);
}
SECP256K1_INLINE
static
void
secp256k1_fe_add
(
secp256k1_fe_t
*
r
,
const
secp256k1_fe_t
*
a
)
{
mpn_add
(
r
->
n
,
r
->
n
,
FIELD_LIMBS
+
1
,
a
->
n
,
FIELD_LIMBS
+
1
);
}
static
void
secp256k1_fe_reduce
(
secp256k1_fe_t
*
r
,
mp_limb_t
*
tmp
)
{
/** <A1 A2 A3 A4> <B1 B2 B3 B4>
* B1 B2 B3 B4
* + C * A1 A2 A3 A4
* + A1 A2 A3 A4
*/
#if (GMP_NUMB_BITS >= 33)
mp_limb_t
o
=
mpn_addmul_1
(
tmp
,
tmp
+
FIELD_LIMBS
,
FIELD_LIMBS
,
0x1000003D1ULL
);
#else
mp_limb_t
o
=
mpn_addmul_1
(
tmp
,
tmp
+
FIELD_LIMBS
,
FIELD_LIMBS
,
0x3D1UL
)
+
mpn_addmul_1
(
tmp
+
(
32
/
GMP_NUMB_BITS
),
tmp
+
FIELD_LIMBS
,
FIELD_LIMBS
-
(
32
/
GMP_NUMB_BITS
),
0x1UL
<<
(
32
%
GMP_NUMB_BITS
));
#endif
mp_limb_t
q
[
1
+
(
33
+
GMP_NUMB_BITS
-
1
)
/
GMP_NUMB_BITS
];
q
[(
33
+
GMP_NUMB_BITS
-
1
)
/
GMP_NUMB_BITS
]
=
mpn_mul_1
(
q
,
secp256k1_field_pc
,
(
33
+
GMP_NUMB_BITS
-
1
)
/
GMP_NUMB_BITS
,
o
);
#if (GMP_NUMB_BITS <= 32)
mp_limb_t
o2
=
tmp
[
2
*
FIELD_LIMBS
-
(
32
/
GMP_NUMB_BITS
)]
<<
(
32
%
GMP_NUMB_BITS
);
q
[(
33
+
GMP_NUMB_BITS
-
1
)
/
GMP_NUMB_BITS
]
+=
mpn_addmul_1
(
q
,
secp256k1_field_pc
,
(
33
+
GMP_NUMB_BITS
-
1
)
/
GMP_NUMB_BITS
,
o2
);
#endif
r
->
n
[
FIELD_LIMBS
]
=
mpn_add
(
r
->
n
,
tmp
,
FIELD_LIMBS
,
q
,
1
+
(
33
+
GMP_NUMB_BITS
-
1
)
/
GMP_NUMB_BITS
);
}
static
void
secp256k1_fe_mul
(
secp256k1_fe_t
*
r
,
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
SECP256K1_RESTRICT
b
)
{
VERIFY_CHECK
(
r
!=
b
);
secp256k1_fe_t
ac
=
*
a
;
secp256k1_fe_t
bc
=
*
b
;
secp256k1_fe_normalize
(
&
ac
);
secp256k1_fe_normalize
(
&
bc
);
mp_limb_t
tmp
[
2
*
FIELD_LIMBS
];
mpn_mul_n
(
tmp
,
ac
.
n
,
bc
.
n
,
FIELD_LIMBS
);
secp256k1_fe_reduce
(
r
,
tmp
);
}
static
void
secp256k1_fe_sqr
(
secp256k1_fe_t
*
r
,
const
secp256k1_fe_t
*
a
)
{
secp256k1_fe_t
ac
=
*
a
;
secp256k1_fe_normalize
(
&
ac
);
mp_limb_t
tmp
[
2
*
FIELD_LIMBS
];
mpn_sqr
(
tmp
,
ac
.
n
,
FIELD_LIMBS
);
secp256k1_fe_reduce
(
r
,
tmp
);
}
static
void
secp256k1_fe_cmov
(
secp256k1_fe_t
*
r
,
const
secp256k1_fe_t
*
a
,
int
flag
)
{
mp_limb_t
mask0
=
flag
+
~
((
mp_limb_t
)
0
),
mask1
=
~
mask0
;
for
(
int
i
=
0
;
i
<=
FIELD_LIMBS
;
i
++
)
{
r
->
n
[
i
]
=
(
r
->
n
[
i
]
&
mask0
)
|
(
a
->
n
[
i
]
&
mask1
);
}
}
#endif
This diff is collapsed.
Click to expand it.
src/secp256k1/src/field_impl.h
View file @
ecdd15f8
...
...
@@ -13,9 +13,7 @@
#include "util.h"
#if defined(USE_FIELD_GMP)
#include "field_gmp_impl.h"
#elif defined(USE_FIELD_10X26)
#if defined(USE_FIELD_10X26)
#include "field_10x26_impl.h"
#elif defined(USE_FIELD_5X52)
#include "field_5x52_impl.h"
...
...
@@ -66,6 +64,13 @@ static int secp256k1_fe_set_hex(secp256k1_fe_t *r, const char *a, int alen) {
return
secp256k1_fe_set_b32
(
r
,
tmp
);
}
SECP256K1_INLINE
static
int
secp256k1_fe_equal_var
(
const
secp256k1_fe_t
*
a
,
const
secp256k1_fe_t
*
b
)
{
secp256k1_fe_t
na
;
secp256k1_fe_negate
(
&
na
,
a
,
1
);
secp256k1_fe_add
(
&
na
,
b
);
return
secp256k1_fe_normalizes_to_zero_var
(
&
na
);
}
static
int
secp256k1_fe_sqrt_var
(
secp256k1_fe_t
*
r
,
const
secp256k1_fe_t
*
a
)
{
/** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in
...
...
@@ -130,10 +135,7 @@ static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
/* Check that a square root was actually calculated */
secp256k1_fe_sqr
(
&
t1
,
r
);
secp256k1_fe_negate
(
&
t1
,
&
t1
,
1
);
secp256k1_fe_add
(
&
t1
,
a
);
secp256k1_fe_normalize_var
(
&
t1
);
return
secp256k1_fe_is_zero
(
&
t1
);
return
secp256k1_fe_equal_var
(
&
t1
,
a
);
}
static
void
secp256k1_fe_inv
(
secp256k1_fe_t
*
r
,
const
secp256k1_fe_t
*
a
)
{
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/group.h
View file @
ecdd15f8
...
...
@@ -60,7 +60,6 @@ static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a);
static
int
secp256k1_ge_is_valid_var
(
const
secp256k1_ge_t
*
a
);
static
void
secp256k1_ge_neg
(
secp256k1_ge_t
*
r
,
const
secp256k1_ge_t
*
a
);
static
void
secp256k1_ge_neg_var
(
secp256k1_ge_t
*
r
,
const
secp256k1_ge_t
*
a
);
/** Get a hex representation of a point. *rlen will be overwritten with the real length. */
static
void
secp256k1_ge_get_hex
(
char
*
r
,
int
*
rlen
,
const
secp256k1_ge_t
*
a
);
...
...
@@ -81,11 +80,11 @@ static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, co
/** Set a group element (jacobian) equal to another which is given in affine coordinates. */
static
void
secp256k1_gej_set_ge
(
secp256k1_gej_t
*
r
,
const
secp256k1_ge_t
*
a
);
/**
Get
the X coordinate of a group element (jacobian). */
static
void
secp256k1_gej_
get
_x_var
(
secp256k1_fe_t
*
r
,
const
secp256k1_gej_t
*
a
);
/**
Compare
the X coordinate of a group element (jacobian). */
static
int
secp256k1_gej_
eq
_x_var
(
const
secp256k1_fe_t
*
x
,
const
secp256k1_gej_t
*
a
);
/** Set r equal to the inverse of a (i.e., mirrored around the X axis) */
static
void
secp256k1_gej_neg
_var
(
secp256k1_gej_t
*
r
,
const
secp256k1_gej_t
*
a
);
static
void
secp256k1_gej_neg
(
secp256k1_gej_t
*
r
,
const
secp256k1_gej_t
*
a
);
/** Check whether a group element is the point at infinity. */
static
int
secp256k1_gej_is_infinity
(
const
secp256k1_gej_t
*
a
);
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/group_impl.h
View file @
ecdd15f8
...
...
@@ -29,13 +29,7 @@ static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a) {
static
void
secp256k1_ge_neg
(
secp256k1_ge_t
*
r
,
const
secp256k1_ge_t
*
a
)
{
*
r
=
*
a
;
secp256k1_fe_normalize
(
&
r
->
y
);
secp256k1_fe_negate
(
&
r
->
y
,
&
r
->
y
,
1
);
}
static
void
secp256k1_ge_neg_var
(
secp256k1_ge_t
*
r
,
const
secp256k1_ge_t
*
a
)
{
*
r
=
*
a
;
secp256k1_fe_normalize_var
(
&
r
->
y
);
secp256k1_fe_normalize_weak
(
&
r
->
y
);
secp256k1_fe_negate
(
&
r
->
y
,
&
r
->
y
,
1
);
}
...
...
@@ -163,17 +157,19 @@ static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a) {
secp256k1_fe_set_int
(
&
r
->
z
,
1
);
}
static
void
secp256k1_gej_get_x_var
(
secp256k1_fe_t
*
r
,
const
secp256k1_gej_t
*
a
)
{
secp256k1_fe_t
zi2
;
secp256k1_fe_inv_var
(
&
zi2
,
&
a
->
z
);
secp256k1_fe_sqr
(
&
zi2
,
&
zi2
);
secp256k1_fe_mul
(
r
,
&
a
->
x
,
&
zi2
);
static
int
secp256k1_gej_eq_x_var
(
const
secp256k1_fe_t
*
x
,
const
secp256k1_gej_t
*
a
)
{
VERIFY_CHECK
(
!
a
->
infinity
);
secp256k1_fe_t
r
;
secp256k1_fe_sqr
(
&
r
,
&
a
->
z
);
secp256k1_fe_mul
(
&
r
,
&
r
,
x
);
secp256k1_fe_t
r2
=
a
->
x
;
secp256k1_fe_normalize_weak
(
&
r2
);
return
secp256k1_fe_equal_var
(
&
r
,
&
r2
);
}
static
void
secp256k1_gej_neg
_var
(
secp256k1_gej_t
*
r
,
const
secp256k1_gej_t
*
a
)
{
static
void
secp256k1_gej_neg
(
secp256k1_gej_t
*
r
,
const
secp256k1_gej_t
*
a
)
{
r
->
infinity
=
a
->
infinity
;
r
->
x
=
a
->
x
;
r
->
y
=
a
->
y
;
r
->
z
=
a
->
z
;
secp256k1_fe_normalize_
var
(
&
r
->
y
);
secp256k1_fe_normalize_
weak
(
&
r
->
y
);
secp256k1_fe_negate
(
&
r
->
y
,
&
r
->
y
,
1
);
}
...
...
@@ -195,9 +191,8 @@ static int secp256k1_gej_is_valid_var(const secp256k1_gej_t *a) {
secp256k1_fe_t
z6
;
secp256k1_fe_sqr
(
&
z6
,
&
z2
);
secp256k1_fe_mul
(
&
z6
,
&
z6
,
&
z2
);
secp256k1_fe_mul_int
(
&
z6
,
7
);
secp256k1_fe_add
(
&
x3
,
&
z6
);
secp256k1_fe_normalize_var
(
&
y2
);
secp256k1_fe_normalize_var
(
&
x3
);
return
secp256k1_fe_equal
(
&
y2
,
&
x3
);
secp256k1_fe_normalize_weak
(
&
x3
);
return
secp256k1_fe_equal_var
(
&
y2
,
&
x3
);
}
static
int
secp256k1_ge_is_valid_var
(
const
secp256k1_ge_t
*
a
)
{
...
...
@@ -208,9 +203,8 @@ static int secp256k1_ge_is_valid_var(const secp256k1_ge_t *a) {
secp256k1_fe_t
x3
;
secp256k1_fe_sqr
(
&
x3
,
&
a
->
x
);
secp256k1_fe_mul
(
&
x3
,
&
x3
,
&
a
->
x
);
secp256k1_fe_t
c
;
secp256k1_fe_set_int
(
&
c
,
7
);
secp256k1_fe_add
(
&
x3
,
&
c
);
secp256k1_fe_normalize_var
(
&
y2
);
secp256k1_fe_normalize_var
(
&
x3
);
return
secp256k1_fe_equal
(
&
y2
,
&
x3
);
secp256k1_fe_normalize_weak
(
&
x3
);
return
secp256k1_fe_equal_var
(
&
y2
,
&
x3
);
}
static
void
secp256k1_gej_double_var
(
secp256k1_gej_t
*
r
,
const
secp256k1_gej_t
*
a
)
{
...
...
@@ -261,20 +255,16 @@ static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a,
secp256k1_fe_t
u2
;
secp256k1_fe_mul
(
&
u2
,
&
b
->
x
,
&
z12
);
secp256k1_fe_t
s1
;
secp256k1_fe_mul
(
&
s1
,
&
a
->
y
,
&
z22
);
secp256k1_fe_mul
(
&
s1
,
&
s1
,
&
b
->
z
);
secp256k1_fe_t
s2
;
secp256k1_fe_mul
(
&
s2
,
&
b
->
y
,
&
z12
);
secp256k1_fe_mul
(
&
s2
,
&
s2
,
&
a
->
z
);
secp256k1_fe_normalize_var
(
&
u1
);
secp256k1_fe_normalize_var
(
&
u2
);
if
(
secp256k1_fe_equal
(
&
u1
,
&
u2
))
{
secp256k1_fe_normalize_var
(
&
s1
);
secp256k1_fe_normalize_var
(
&
s2
);
if
(
secp256k1_fe_equal
(
&
s1
,
&
s2
))
{
secp256k1_fe_t
h
;
secp256k1_fe_negate
(
&
h
,
&
u1
,
1
);
secp256k1_fe_add
(
&
h
,
&
u2
);
secp256k1_fe_t
i
;
secp256k1_fe_negate
(
&
i
,
&
s1
,
1
);
secp256k1_fe_add
(
&
i
,
&
s2
);
if
(
secp256k1_fe_normalizes_to_zero_var
(
&
h
))
{
if
(
secp256k1_fe_normalizes_to_zero_var
(
&
i
))
{
secp256k1_gej_double_var
(
r
,
a
);
}
else
{
r
->
infinity
=
1
;
}
return
;
}
secp256k1_fe_t
h
;
secp256k1_fe_negate
(
&
h
,
&
u1
,
1
);
secp256k1_fe_add
(
&
h
,
&
u2
);
secp256k1_fe_t
i
;
secp256k1_fe_negate
(
&
i
,
&
s1
,
1
);
secp256k1_fe_add
(
&
i
,
&
s2
);
secp256k1_fe_t
i2
;
secp256k1_fe_sqr
(
&
i2
,
&
i
);
secp256k1_fe_t
h2
;
secp256k1_fe_sqr
(
&
h2
,
&
h
);
secp256k1_fe_t
h3
;
secp256k1_fe_mul
(
&
h3
,
&
h
,
&
h2
);
...
...
@@ -300,23 +290,20 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *
}
r
->
infinity
=
0
;
secp256k1_fe_t
z12
;
secp256k1_fe_sqr
(
&
z12
,
&
a
->
z
);
secp256k1_fe_t
u1
=
a
->
x
;
secp256k1_fe_t
u1
=
a
->
x
;
secp256k1_fe_normalize_weak
(
&
u1
);
secp256k1_fe_t
u2
;
secp256k1_fe_mul
(
&
u2
,
&
b
->
x
,
&
z12
);
secp256k1_fe_t
s1
=
a
->
y
;
secp256k1_fe_normalize_
var
(
&
s1
);
secp256k1_fe_t
s1
=
a
->
y
;
secp256k1_fe_normalize_
weak
(
&
s1
);
secp256k1_fe_t
s2
;
secp256k1_fe_mul
(
&
s2
,
&
b
->
y
,
&
z12
);
secp256k1_fe_mul
(
&
s2
,
&
s2
,
&
a
->
z
);
secp256k1_fe_normalize_var
(
&
u1
);
secp256k1_fe_normalize_var
(
&
u2
);
if
(
secp256k1_fe_equal
(
&
u1
,
&
u2
))
{
secp256k1_fe_normalize_var
(
&
s2
);
if
(
secp256k1_fe_equal
(
&
s1
,
&
s2
))
{
secp256k1_fe_t
h
;
secp256k1_fe_negate
(
&
h
,
&
u1
,
1
);
secp256k1_fe_add
(
&
h
,
&
u2
);
secp256k1_fe_t
i
;
secp256k1_fe_negate
(
&
i
,
&
s1
,
1
);
secp256k1_fe_add
(
&
i
,
&
s2
);
if
(
secp256k1_fe_normalizes_to_zero_var
(
&
h
))
{
if
(
secp256k1_fe_normalizes_to_zero_var
(
&
i
))
{
secp256k1_gej_double_var
(
r
,
a
);
}
else
{
r
->
infinity
=
1
;
}
return
;
}
secp256k1_fe_t
h
;
secp256k1_fe_negate
(
&
h
,
&
u1
,
1
);
secp256k1_fe_add
(
&
h
,
&
u2
);
secp256k1_fe_t
i
;
secp256k1_fe_negate
(
&
i
,
&
s1
,
1
);
secp256k1_fe_add
(
&
i
,
&
s2
);
secp256k1_fe_t
i2
;
secp256k1_fe_sqr
(
&
i2
,
&
i
);
secp256k1_fe_t
h2
;
secp256k1_fe_sqr
(
&
h2
,
&
h
);
secp256k1_fe_t
h3
;
secp256k1_fe_mul
(
&
h3
,
&
h
,
&
h2
);
...
...
@@ -355,9 +342,9 @@ static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, c
*/
secp256k1_fe_t
zz
;
secp256k1_fe_sqr
(
&
zz
,
&
a
->
z
);
/* z = Z1^2 */
secp256k1_fe_t
u1
=
a
->
x
;
secp256k1_fe_normalize
(
&
u1
);
/* u1 = U1 = X1*Z2^2 (1) */
secp256k1_fe_t
u1
=
a
->
x
;
secp256k1_fe_normalize
_weak
(
&
u1
);
/* u1 = U1 = X1*Z2^2 (1) */
secp256k1_fe_t
u2
;
secp256k1_fe_mul
(
&
u2
,
&
b
->
x
,
&
zz
);
/* u2 = U2 = X2*Z1^2 (1) */
secp256k1_fe_t
s1
=
a
->
y
;
secp256k1_fe_normalize
(
&
s1
);
/* s1 = S1 = Y1*Z2^3 (1) */
secp256k1_fe_t
s1
=
a
->
y
;
secp256k1_fe_normalize
_weak
(
&
s1
);
/* s1 = S1 = Y1*Z2^3 (1) */
secp256k1_fe_t
s2
;
secp256k1_fe_mul
(
&
s2
,
&
b
->
y
,
&
zz
);
/* s2 = Y2*Z2^2 (1) */
secp256k1_fe_mul
(
&
s2
,
&
s2
,
&
a
->
z
);
/* s2 = S2 = Y2*Z1^3 (1) */
secp256k1_fe_t
z
=
a
->
z
;
/* z = Z = Z1*Z2 (8) */
...
...
@@ -371,8 +358,7 @@ static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, c
secp256k1_fe_add
(
&
rr
,
&
t
);
/* rr = R = T^2-U1*U2 (3) */
secp256k1_fe_sqr
(
&
t
,
&
rr
);
/* t = R^2 (1) */
secp256k1_fe_mul
(
&
r
->
z
,
&
m
,
&
z
);
/* r->z = M*Z (1) */
secp256k1_fe_normalize
(
&
r
->
z
);
int
infinity
=
secp256k1_fe_is_zero
(
&
r
->
z
)
*
(
1
-
a
->
infinity
);
int
infinity
=
secp256k1_fe_normalizes_to_zero
(
&
r
->
z
)
*
(
1
-
a
->
infinity
);
secp256k1_fe_mul_int
(
&
r
->
z
,
2
*
(
1
-
a
->
infinity
));
/* r->z = Z3 = 2*M*Z (2) */
r
->
x
=
t
;
/* r->x = R^2 (1) */
secp256k1_fe_negate
(
&
q
,
&
q
,
1
);
/* q = -Q (2) */
...
...
@@ -384,7 +370,7 @@ static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, c
secp256k1_fe_mul
(
&
t
,
&
t
,
&
rr
);
/* t = R*(2*R^2-3*Q) (1) */
secp256k1_fe_add
(
&
t
,
&
n
);
/* t = R*(2*R^2-3*Q)+M^4 (2) */
secp256k1_fe_negate
(
&
r
->
y
,
&
t
,
2
);
/* r->y = R*(3*Q-2*R^2)-M^4 (3) */
secp256k1_fe_normalize
(
&
r
->
y
);
secp256k1_fe_normalize
_weak
(
&
r
->
y
);
secp256k1_fe_mul_int
(
&
r
->
x
,
4
*
(
1
-
a
->
infinity
));
/* r->x = X3 = 4*(R^2-Q) */
secp256k1_fe_mul_int
(
&
r
->
y
,
4
*
(
1
-
a
->
infinity
));
/* r->y = Y3 = 4*R*(3*Q-2*R^2)-4*M^4 (4) */
...
...
This diff is collapsed.
Click to expand it.
src/secp256k1/src/hash.h
0 → 100644
View file @
ecdd15f8
/**********************************************************************
* Copyright (c) 2014 Pieter Wuille *
* Distributed under the MIT software license, see the accompanying *
* file COPYING or http://www.opensource.org/licenses/mit-license.php.*
**********************************************************************/
#ifndef _SECP256K1_HASH_
#define _SECP256K1_HASH_
#include <stdlib.h>
#include <stdint.h>
typedef
struct
{
uint32_t
s
[
32
];
unsigned
char
buf
[
64
];
size_t
bytes
;
}
secp256k1_sha256_t
;
static
void
secp256k1_sha256_initialize
(
secp256k1_sha256_t
*
hash
);
static
void
secp256k1_sha256_write
(
secp256k1_sha256_t
*
hash
,
const
unsigned
char
*
data
,
size_t
size
);
static
void
secp256k1_sha256_finalize
(
secp256k1_sha256_t
*
hash
,
unsigned
char
*
out32
);
typedef
struct
{
secp256k1_sha256_t
inner
,
outer
;
}
secp256k1_hmac_sha256_t
;
static
void
secp256k1_hmac_sha256_initialize
(
secp256k1_hmac_sha256_t
*
hash
,
const
unsigned
char
*
key
,
size_t
size
);
static
void
secp256k1_hmac_sha256_write
(
secp256k1_hmac_sha256_t
*
hash
,
const
unsigned
char
*
data
,
size_t
size
);
static
void
secp256k1_hmac_sha256_finalize
(
secp256k1_hmac_sha256_t
*
hash
,
unsigned
char
*
out32
);
typedef
struct
{
unsigned
char
v
[
32
];
unsigned
char
k
[
32
];
int
retry
;
}
secp256k1_rfc6979_hmac_sha256_t
;
static
void
secp256k1_rfc6979_hmac_sha256_initialize
(
secp256k1_rfc6979_hmac_sha256_t
*
rng
,
const
unsigned
char
*
key
,
size_t
keylen
,
const
unsigned
char
*
msg
,
size_t
msglen
);
static
void
secp256k1_rfc6979_hmac_sha256_generate
(
secp256k1_rfc6979_hmac_sha256_t
*
rng
,
unsigned
char
*
out
,
size_t
outlen
);
static
void
secp256k1_rfc6979_hmac_sha256_finalize
(
secp256k1_rfc6979_hmac_sha256_t
*
rng
);
#endif
This diff is collapsed.
Click to expand it.
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment