@authon/react-native-wallet 0.0.0-stage → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +251 -2
- package/android/build.gradle +40 -0
- package/android/consumer-rules.pro +10 -0
- package/android/src/main/AndroidManifest.xml +8 -0
- package/android/src/main/java/dev/authon/reactnative/wallet/AuthonWalletModule.kt +235 -0
- package/android/src/vendor/GENERATED.md +4 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/AndroidCapabilityProbe.kt +86 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/AuthonWallet.kt +218 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Bitcoin.kt +296 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Bytes.kt +74 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Chains.kt +157 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/CredentialManagerPasskeys.kt +192 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Der.kt +17 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/DeviceStore.kt +170 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/DialogWalletApprover.kt +141 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Eip712.kt +176 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Encodings.kt +133 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/EvmAccount.kt +45 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/EvmTransaction.kt +180 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/GfTables.kt +44 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/HdWallet.kt +130 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Http.kt +86 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/JsValues.kt +83 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/KeystoreDeviceStore.kt +236 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Prf.kt +111 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Proof.kt +134 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Shamir.kt +106 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/SignSummary.kt +335 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Solana.kt +195 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Tron.kt +184 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletApi.kt +361 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletCapabilities.kt +91 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletError.kt +74 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletOps.kt +551 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletTypes.kt +78 -0
- package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Xrp.kt +193 -0
- package/build/authonContext.d.ts +19 -0
- package/build/authonContext.d.ts.map +1 -0
- package/build/authonContext.js +20 -0
- package/build/authonContext.js.map +1 -0
- package/build/client.d.ts +92 -0
- package/build/client.d.ts.map +1 -0
- package/build/client.js +431 -0
- package/build/client.js.map +1 -0
- package/build/errors.d.ts +25 -0
- package/build/errors.d.ts.map +1 -0
- package/build/errors.js +15 -0
- package/build/errors.js.map +1 -0
- package/build/index.d.ts +7 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +4 -0
- package/build/index.js.map +1 -0
- package/build/native.d.ts +43 -0
- package/build/native.d.ts.map +1 -0
- package/build/native.js +12 -0
- package/build/native.js.map +1 -0
- package/build/types.d.ts +167 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +3 -0
- package/build/types.js.map +1 -0
- package/build/useAuthonWallet.d.ts +25 -0
- package/build/useAuthonWallet.d.ts.map +1 -0
- package/build/useAuthonWallet.js +77 -0
- package/build/useAuthonWallet.js.map +1 -0
- package/expo-module.config.json +9 -0
- package/ios/AuthonReactNativeWallet.podspec +41 -0
- package/ios/AuthonWalletModule.swift +233 -0
- package/ios/vendor/AuthonWallet/AuthonWallet.swift +232 -0
- package/ios/vendor/AuthonWallet/Capabilities.swift +149 -0
- package/ios/vendor/AuthonWallet/Chains/Bitcoin.swift +296 -0
- package/ios/vendor/AuthonWallet/Chains/Solana.swift +207 -0
- package/ios/vendor/AuthonWallet/Chains/Tron.swift +181 -0
- package/ios/vendor/AuthonWallet/Chains/XRP.swift +191 -0
- package/ios/vendor/AuthonWallet/Crypto/BIP39Wordlist.swift +262 -0
- package/ios/vendor/AuthonWallet/Crypto/Chains.swift +278 -0
- package/ios/vendor/AuthonWallet/Crypto/HDKey.swift +108 -0
- package/ios/vendor/AuthonWallet/Crypto/Secp256k1.swift +128 -0
- package/ios/vendor/AuthonWallet/Crypto/Shamir.swift +123 -0
- package/ios/vendor/AuthonWallet/EVM/Address.swift +57 -0
- package/ios/vendor/AuthonWallet/EVM/EvmAccount.swift +48 -0
- package/ios/vendor/AuthonWallet/EVM/Transaction.swift +165 -0
- package/ios/vendor/AuthonWallet/EVM/TypedData.swift +193 -0
- package/ios/vendor/AuthonWallet/Support/BigInteger.swift +220 -0
- package/ios/vendor/AuthonWallet/Support/Bytes.swift +89 -0
- package/ios/vendor/AuthonWallet/Support/JSONValue.swift +341 -0
- package/ios/vendor/AuthonWallet/UI/WalletApprover.swift +250 -0
- package/ios/vendor/AuthonWallet/Wallet/Backup.swift +69 -0
- package/ios/vendor/AuthonWallet/Wallet/DeviceStore.swift +351 -0
- package/ios/vendor/AuthonWallet/Wallet/Passkeys.swift +190 -0
- package/ios/vendor/AuthonWallet/Wallet/Proof.swift +143 -0
- package/ios/vendor/AuthonWallet/Wallet/Shares.swift +116 -0
- package/ios/vendor/AuthonWallet/Wallet/Summary.swift +342 -0
- package/ios/vendor/AuthonWallet/Wallet/WalletAPI.swift +361 -0
- package/ios/vendor/AuthonWallet/Wallet/WalletOps.swift +654 -0
- package/ios/vendor/AuthonWallet/WalletError.swift +84 -0
- package/ios/vendor/CKeccak/LICENSE +22 -0
- package/ios/vendor/CKeccak/README.md +30 -0
- package/ios/vendor/CKeccak/byte_order.h +59 -0
- package/ios/vendor/CKeccak/include/ckeccak.h +13 -0
- package/ios/vendor/CKeccak/memzero.c +75 -0
- package/ios/vendor/CKeccak/memzero.h +8 -0
- package/ios/vendor/CKeccak/options.h +99 -0
- package/ios/vendor/CKeccak/ripemd160.c +343 -0
- package/ios/vendor/CKeccak/ripemd160.h +22 -0
- package/ios/vendor/CKeccak/sha3.c +413 -0
- package/ios/vendor/CKeccak/sha3.h +89 -0
- package/ios/vendor/CMonocypher/LICENCE.md +173 -0
- package/ios/vendor/CMonocypher/README.md +27 -0
- package/ios/vendor/CMonocypher/include/monocypher-ed25519.h +140 -0
- package/ios/vendor/CMonocypher/include/monocypher.h +321 -0
- package/ios/vendor/CMonocypher/monocypher-ed25519.c +500 -0
- package/ios/vendor/CMonocypher/monocypher.c +2956 -0
- package/ios/vendor/CSecp256k1/COPYING +19 -0
- package/ios/vendor/CSecp256k1/README.md +35 -0
- package/ios/vendor/CSecp256k1/build/precomputed_ecmult.c +3 -0
- package/ios/vendor/CSecp256k1/build/precomputed_ecmult_gen.c +3 -0
- package/ios/vendor/CSecp256k1/build/secp256k1.c +3 -0
- package/ios/vendor/CSecp256k1/include/secp256k1.h +899 -0
- package/ios/vendor/CSecp256k1/include/secp256k1_preallocated.h +134 -0
- package/ios/vendor/CSecp256k1/include/secp256k1_recovery.h +113 -0
- package/ios/vendor/CSecp256k1/src/assumptions.h +87 -0
- package/ios/vendor/CSecp256k1/src/checkmem.h +102 -0
- package/ios/vendor/CSecp256k1/src/ecdsa.h +21 -0
- package/ios/vendor/CSecp256k1/src/ecdsa_impl.h +304 -0
- package/ios/vendor/CSecp256k1/src/eckey.h +25 -0
- package/ios/vendor/CSecp256k1/src/eckey_impl.h +92 -0
- package/ios/vendor/CSecp256k1/src/ecmult.h +61 -0
- package/ios/vendor/CSecp256k1/src/ecmult_const.h +38 -0
- package/ios/vendor/CSecp256k1/src/ecmult_const_impl.h +399 -0
- package/ios/vendor/CSecp256k1/src/ecmult_gen.h +143 -0
- package/ios/vendor/CSecp256k1/src/ecmult_gen_impl.h +341 -0
- package/ios/vendor/CSecp256k1/src/ecmult_impl.h +853 -0
- package/ios/vendor/CSecp256k1/src/field.h +350 -0
- package/ios/vendor/CSecp256k1/src/field_10x26.h +57 -0
- package/ios/vendor/CSecp256k1/src/field_10x26_impl.h +1232 -0
- package/ios/vendor/CSecp256k1/src/field_5x52.h +62 -0
- package/ios/vendor/CSecp256k1/src/field_5x52_impl.h +522 -0
- package/ios/vendor/CSecp256k1/src/field_5x52_int128_impl.h +274 -0
- package/ios/vendor/CSecp256k1/src/field_impl.h +457 -0
- package/ios/vendor/CSecp256k1/src/group.h +212 -0
- package/ios/vendor/CSecp256k1/src/group_impl.h +974 -0
- package/ios/vendor/CSecp256k1/src/hash.h +44 -0
- package/ios/vendor/CSecp256k1/src/hash_impl.h +299 -0
- package/ios/vendor/CSecp256k1/src/hsort.h +33 -0
- package/ios/vendor/CSecp256k1/src/hsort_impl.h +125 -0
- package/ios/vendor/CSecp256k1/src/int128.h +90 -0
- package/ios/vendor/CSecp256k1/src/int128_impl.h +18 -0
- package/ios/vendor/CSecp256k1/src/int128_native.h +19 -0
- package/ios/vendor/CSecp256k1/src/int128_native_impl.h +94 -0
- package/ios/vendor/CSecp256k1/src/int128_struct.h +14 -0
- package/ios/vendor/CSecp256k1/src/int128_struct_impl.h +205 -0
- package/ios/vendor/CSecp256k1/src/modinv32.h +43 -0
- package/ios/vendor/CSecp256k1/src/modinv32_impl.h +725 -0
- package/ios/vendor/CSecp256k1/src/modinv64.h +47 -0
- package/ios/vendor/CSecp256k1/src/modinv64_impl.h +780 -0
- package/ios/vendor/CSecp256k1/src/modules/recovery/main_impl.h +159 -0
- package/ios/vendor/CSecp256k1/src/precomputed_ecmult.c +16456 -0
- package/ios/vendor/CSecp256k1/src/precomputed_ecmult.h +38 -0
- package/ios/vendor/CSecp256k1/src/precomputed_ecmult_gen.c +1779 -0
- package/ios/vendor/CSecp256k1/src/precomputed_ecmult_gen.h +26 -0
- package/ios/vendor/CSecp256k1/src/scalar.h +105 -0
- package/ios/vendor/CSecp256k1/src/scalar_4x64.h +19 -0
- package/ios/vendor/CSecp256k1/src/scalar_4x64_impl.h +1000 -0
- package/ios/vendor/CSecp256k1/src/scalar_8x32.h +19 -0
- package/ios/vendor/CSecp256k1/src/scalar_8x32_impl.h +816 -0
- package/ios/vendor/CSecp256k1/src/scalar_impl.h +321 -0
- package/ios/vendor/CSecp256k1/src/scalar_low.h +24 -0
- package/ios/vendor/CSecp256k1/src/scalar_low_impl.h +206 -0
- package/ios/vendor/CSecp256k1/src/scratch.h +44 -0
- package/ios/vendor/CSecp256k1/src/scratch_impl.h +99 -0
- package/ios/vendor/CSecp256k1/src/secp256k1.c +831 -0
- package/ios/vendor/CSecp256k1/src/selftest.h +32 -0
- package/ios/vendor/CSecp256k1/src/util.h +451 -0
- package/ios/vendor/GENERATED.md +4 -0
- package/package.json +66 -3
- package/src/authonContext.ts +30 -0
- package/src/client.ts +459 -0
- package/src/errors.ts +58 -0
- package/src/index.ts +26 -0
- package/src/native.ts +52 -0
- package/src/types.ts +171 -0
- package/src/useAuthonWallet.ts +103 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/***********************************************************************
|
|
2
|
+
* Copyright (c) 2014 Pieter Wuille *
|
|
3
|
+
* Distributed under the MIT software license, see the accompanying *
|
|
4
|
+
* file COPYING or https://www.opensource.org/licenses/mit-license.php.*
|
|
5
|
+
***********************************************************************/
|
|
6
|
+
|
|
7
|
+
#ifndef SECP256K1_SCALAR_IMPL_H
|
|
8
|
+
#define SECP256K1_SCALAR_IMPL_H
|
|
9
|
+
|
|
10
|
+
#ifdef VERIFY
|
|
11
|
+
#include <string.h>
|
|
12
|
+
#endif
|
|
13
|
+
|
|
14
|
+
#include "scalar.h"
|
|
15
|
+
#include "util.h"
|
|
16
|
+
|
|
17
|
+
#if defined(EXHAUSTIVE_TEST_ORDER)
|
|
18
|
+
#include "scalar_low_impl.h"
|
|
19
|
+
#elif defined(SECP256K1_WIDEMUL_INT128)
|
|
20
|
+
#include "scalar_4x64_impl.h"
|
|
21
|
+
#elif defined(SECP256K1_WIDEMUL_INT64)
|
|
22
|
+
#include "scalar_8x32_impl.h"
|
|
23
|
+
#else
|
|
24
|
+
#error "Please select wide multiplication implementation"
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
static const secp256k1_scalar secp256k1_scalar_one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);
|
|
28
|
+
static const secp256k1_scalar secp256k1_scalar_zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);
|
|
29
|
+
|
|
30
|
+
SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) {
|
|
31
|
+
secp256k1_memclear(r, sizeof(secp256k1_scalar));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static int secp256k1_scalar_set_b32_seckey(secp256k1_scalar *r, const unsigned char *bin) {
|
|
35
|
+
int overflow;
|
|
36
|
+
secp256k1_scalar_set_b32(r, bin, &overflow);
|
|
37
|
+
|
|
38
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
39
|
+
return (!overflow) & (!secp256k1_scalar_is_zero(r));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static void secp256k1_scalar_verify(const secp256k1_scalar *r) {
|
|
43
|
+
VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0);
|
|
44
|
+
|
|
45
|
+
(void)r;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
#if defined(EXHAUSTIVE_TEST_ORDER)
|
|
49
|
+
/* Begin of section generated by sage/gen_exhaustive_groups.sage. */
|
|
50
|
+
# if EXHAUSTIVE_TEST_ORDER == 7
|
|
51
|
+
# define EXHAUSTIVE_TEST_LAMBDA 2
|
|
52
|
+
# elif EXHAUSTIVE_TEST_ORDER == 13
|
|
53
|
+
# define EXHAUSTIVE_TEST_LAMBDA 9
|
|
54
|
+
# elif EXHAUSTIVE_TEST_ORDER == 199
|
|
55
|
+
# define EXHAUSTIVE_TEST_LAMBDA 92
|
|
56
|
+
# else
|
|
57
|
+
# error No known lambda for the specified exhaustive test group order.
|
|
58
|
+
# endif
|
|
59
|
+
/* End of section generated by sage/gen_exhaustive_groups.sage. */
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Find r1 and r2 given k, such that r1 + r2 * lambda == k mod n; unlike in the
|
|
63
|
+
* full case we don't bother making r1 and r2 be small, we just want them to be
|
|
64
|
+
* nontrivial to get full test coverage for the exhaustive tests. We therefore
|
|
65
|
+
* (arbitrarily) set r2 = k + 5 (mod n) and r1 = k - r2 * lambda (mod n).
|
|
66
|
+
*/
|
|
67
|
+
static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT r1, secp256k1_scalar * SECP256K1_RESTRICT r2, const secp256k1_scalar * SECP256K1_RESTRICT k) {
|
|
68
|
+
SECP256K1_SCALAR_VERIFY(k);
|
|
69
|
+
VERIFY_CHECK(r1 != k);
|
|
70
|
+
VERIFY_CHECK(r2 != k);
|
|
71
|
+
VERIFY_CHECK(r1 != r2);
|
|
72
|
+
|
|
73
|
+
*r2 = (*k + 5) % EXHAUSTIVE_TEST_ORDER;
|
|
74
|
+
*r1 = (*k + (EXHAUSTIVE_TEST_ORDER - *r2) * EXHAUSTIVE_TEST_LAMBDA) % EXHAUSTIVE_TEST_ORDER;
|
|
75
|
+
|
|
76
|
+
SECP256K1_SCALAR_VERIFY(r1);
|
|
77
|
+
SECP256K1_SCALAR_VERIFY(r2);
|
|
78
|
+
}
|
|
79
|
+
#else
|
|
80
|
+
/**
|
|
81
|
+
* The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where
|
|
82
|
+
* lambda is: */
|
|
83
|
+
static const secp256k1_scalar secp256k1_const_lambda = SECP256K1_SCALAR_CONST(
|
|
84
|
+
0x5363AD4CUL, 0xC05C30E0UL, 0xA5261C02UL, 0x8812645AUL,
|
|
85
|
+
0x122E22EAUL, 0x20816678UL, 0xDF02967CUL, 0x1B23BD72UL
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
#ifdef VERIFY
|
|
89
|
+
static void secp256k1_scalar_split_lambda_verify(const secp256k1_scalar *r1, const secp256k1_scalar *r2, const secp256k1_scalar *k);
|
|
90
|
+
#endif
|
|
91
|
+
|
|
92
|
+
/*
|
|
93
|
+
* Both lambda and beta are primitive cube roots of unity. That is lamba^3 == 1 mod n and
|
|
94
|
+
* beta^3 == 1 mod p, where n is the curve order and p is the field order.
|
|
95
|
+
*
|
|
96
|
+
* Furthermore, because (X^3 - 1) = (X - 1)(X^2 + X + 1), the primitive cube roots of unity are
|
|
97
|
+
* roots of X^2 + X + 1. Therefore lambda^2 + lamba == -1 mod n and beta^2 + beta == -1 mod p.
|
|
98
|
+
* (The other primitive cube roots of unity are lambda^2 and beta^2 respectively.)
|
|
99
|
+
*
|
|
100
|
+
* Let l = -1/2 + i*sqrt(3)/2, the complex root of X^2 + X + 1. We can define a ring
|
|
101
|
+
* homomorphism phi : Z[l] -> Z_n where phi(a + b*l) == a + b*lambda mod n. The kernel of phi
|
|
102
|
+
* is a lattice over Z[l] (considering Z[l] as a Z-module). This lattice is generated by a
|
|
103
|
+
* reduced basis {a1 + b1*l, a2 + b2*l} where
|
|
104
|
+
*
|
|
105
|
+
* - a1 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15}
|
|
106
|
+
* - b1 = -{0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28,0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3}
|
|
107
|
+
* - a2 = {0x01,0x14,0xca,0x50,0xf7,0xa8,0xe2,0xf3,0xf6,0x57,0xc1,0x10,0x8d,0x9d,0x44,0xcf,0xd8}
|
|
108
|
+
* - b2 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15}
|
|
109
|
+
*
|
|
110
|
+
* "Guide to Elliptic Curve Cryptography" (Hankerson, Menezes, Vanstone) gives an algorithm
|
|
111
|
+
* (algorithm 3.74) to find k1 and k2 given k, such that k1 + k2 * lambda == k mod n, and k1
|
|
112
|
+
* and k2 are small in absolute value.
|
|
113
|
+
*
|
|
114
|
+
* The algorithm computes c1 = round(b2 * k / n) and c2 = round((-b1) * k / n), and gives
|
|
115
|
+
* k1 = k - (c1*a1 + c2*a2) and k2 = -(c1*b1 + c2*b2). Instead, we use modular arithmetic, and
|
|
116
|
+
* compute r2 = k2 mod n, and r1 = k1 mod n = (k - r2 * lambda) mod n, avoiding the need for
|
|
117
|
+
* the constants a1 and a2.
|
|
118
|
+
*
|
|
119
|
+
* g1, g2 are precomputed constants used to replace division with a rounded multiplication
|
|
120
|
+
* when decomposing the scalar for an endomorphism-based point multiplication.
|
|
121
|
+
*
|
|
122
|
+
* The possibility of using precomputed estimates is mentioned in "Guide to Elliptic Curve
|
|
123
|
+
* Cryptography" (Hankerson, Menezes, Vanstone) in section 3.5.
|
|
124
|
+
*
|
|
125
|
+
* The derivation is described in the paper "Efficient Software Implementation of Public-Key
|
|
126
|
+
* Cryptography on Sensor Networks Using the MSP430X Microcontroller" (Gouvea, Oliveira, Lopez),
|
|
127
|
+
* Section 4.3 (here we use a somewhat higher-precision estimate):
|
|
128
|
+
* d = a1*b2 - b1*a2
|
|
129
|
+
* g1 = round(2^384 * b2/d)
|
|
130
|
+
* g2 = round(2^384 * (-b1)/d)
|
|
131
|
+
*
|
|
132
|
+
* (Note that d is also equal to the curve order, n, here because [a1,b1] and [a2,b2]
|
|
133
|
+
* can be found as outputs of the Extended Euclidean Algorithm on inputs n and lambda).
|
|
134
|
+
*
|
|
135
|
+
* The function below splits k into r1 and r2, such that
|
|
136
|
+
* - r1 + lambda * r2 == k (mod n)
|
|
137
|
+
* - either r1 < 2^128 or -r1 mod n < 2^128
|
|
138
|
+
* - either r2 < 2^128 or -r2 mod n < 2^128
|
|
139
|
+
*
|
|
140
|
+
* See proof below.
|
|
141
|
+
*/
|
|
142
|
+
static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT r1, secp256k1_scalar * SECP256K1_RESTRICT r2, const secp256k1_scalar * SECP256K1_RESTRICT k) {
|
|
143
|
+
secp256k1_scalar c1, c2;
|
|
144
|
+
static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST(
|
|
145
|
+
0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
|
|
146
|
+
0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL
|
|
147
|
+
);
|
|
148
|
+
static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST(
|
|
149
|
+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL,
|
|
150
|
+
0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL
|
|
151
|
+
);
|
|
152
|
+
static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST(
|
|
153
|
+
0x3086D221UL, 0xA7D46BCDUL, 0xE86C90E4UL, 0x9284EB15UL,
|
|
154
|
+
0x3DAA8A14UL, 0x71E8CA7FUL, 0xE893209AUL, 0x45DBB031UL
|
|
155
|
+
);
|
|
156
|
+
static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST(
|
|
157
|
+
0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C4UL,
|
|
158
|
+
0x221208ACUL, 0x9DF506C6UL, 0x1571B4AEUL, 0x8AC47F71UL
|
|
159
|
+
);
|
|
160
|
+
SECP256K1_SCALAR_VERIFY(k);
|
|
161
|
+
VERIFY_CHECK(r1 != k);
|
|
162
|
+
VERIFY_CHECK(r2 != k);
|
|
163
|
+
VERIFY_CHECK(r1 != r2);
|
|
164
|
+
|
|
165
|
+
/* these _var calls are constant time since the shift amount is constant */
|
|
166
|
+
secp256k1_scalar_mul_shift_var(&c1, k, &g1, 384);
|
|
167
|
+
secp256k1_scalar_mul_shift_var(&c2, k, &g2, 384);
|
|
168
|
+
secp256k1_scalar_mul(&c1, &c1, &minus_b1);
|
|
169
|
+
secp256k1_scalar_mul(&c2, &c2, &minus_b2);
|
|
170
|
+
secp256k1_scalar_add(r2, &c1, &c2);
|
|
171
|
+
secp256k1_scalar_mul(r1, r2, &secp256k1_const_lambda);
|
|
172
|
+
secp256k1_scalar_negate(r1, r1);
|
|
173
|
+
secp256k1_scalar_add(r1, r1, k);
|
|
174
|
+
|
|
175
|
+
SECP256K1_SCALAR_VERIFY(r1);
|
|
176
|
+
SECP256K1_SCALAR_VERIFY(r2);
|
|
177
|
+
#ifdef VERIFY
|
|
178
|
+
secp256k1_scalar_split_lambda_verify(r1, r2, k);
|
|
179
|
+
#endif
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
#ifdef VERIFY
|
|
183
|
+
/*
|
|
184
|
+
* Proof for secp256k1_scalar_split_lambda's bounds.
|
|
185
|
+
*
|
|
186
|
+
* Let
|
|
187
|
+
* - epsilon1 = 2^256 * |g1/2^384 - b2/d|
|
|
188
|
+
* - epsilon2 = 2^256 * |g2/2^384 - (-b1)/d|
|
|
189
|
+
* - c1 = round(k*g1/2^384)
|
|
190
|
+
* - c2 = round(k*g2/2^384)
|
|
191
|
+
*
|
|
192
|
+
* Lemma 1: |c1 - k*b2/d| < 2^-1 + epsilon1
|
|
193
|
+
*
|
|
194
|
+
* |c1 - k*b2/d|
|
|
195
|
+
* =
|
|
196
|
+
* |c1 - k*g1/2^384 + k*g1/2^384 - k*b2/d|
|
|
197
|
+
* <= {triangle inequality}
|
|
198
|
+
* |c1 - k*g1/2^384| + |k*g1/2^384 - k*b2/d|
|
|
199
|
+
* =
|
|
200
|
+
* |c1 - k*g1/2^384| + k*|g1/2^384 - b2/d|
|
|
201
|
+
* < {rounding in c1 and 0 <= k < 2^256}
|
|
202
|
+
* 2^-1 + 2^256 * |g1/2^384 - b2/d|
|
|
203
|
+
* = {definition of epsilon1}
|
|
204
|
+
* 2^-1 + epsilon1
|
|
205
|
+
*
|
|
206
|
+
* Lemma 2: |c2 - k*(-b1)/d| < 2^-1 + epsilon2
|
|
207
|
+
*
|
|
208
|
+
* |c2 - k*(-b1)/d|
|
|
209
|
+
* =
|
|
210
|
+
* |c2 - k*g2/2^384 + k*g2/2^384 - k*(-b1)/d|
|
|
211
|
+
* <= {triangle inequality}
|
|
212
|
+
* |c2 - k*g2/2^384| + |k*g2/2^384 - k*(-b1)/d|
|
|
213
|
+
* =
|
|
214
|
+
* |c2 - k*g2/2^384| + k*|g2/2^384 - (-b1)/d|
|
|
215
|
+
* < {rounding in c2 and 0 <= k < 2^256}
|
|
216
|
+
* 2^-1 + 2^256 * |g2/2^384 - (-b1)/d|
|
|
217
|
+
* = {definition of epsilon2}
|
|
218
|
+
* 2^-1 + epsilon2
|
|
219
|
+
*
|
|
220
|
+
* Let
|
|
221
|
+
* - k1 = k - c1*a1 - c2*a2
|
|
222
|
+
* - k2 = - c1*b1 - c2*b2
|
|
223
|
+
*
|
|
224
|
+
* Lemma 3: |k1| < (a1 + a2 + 1)/2 < 2^128
|
|
225
|
+
*
|
|
226
|
+
* |k1|
|
|
227
|
+
* = {definition of k1}
|
|
228
|
+
* |k - c1*a1 - c2*a2|
|
|
229
|
+
* = {(a1*b2 - b1*a2)/n = 1}
|
|
230
|
+
* |k*(a1*b2 - b1*a2)/n - c1*a1 - c2*a2|
|
|
231
|
+
* =
|
|
232
|
+
* |a1*(k*b2/n - c1) + a2*(k*(-b1)/n - c2)|
|
|
233
|
+
* <= {triangle inequality}
|
|
234
|
+
* a1*|k*b2/n - c1| + a2*|k*(-b1)/n - c2|
|
|
235
|
+
* < {Lemma 1 and Lemma 2}
|
|
236
|
+
* a1*(2^-1 + epsilon1) + a2*(2^-1 + epsilon2)
|
|
237
|
+
* < {rounding up to an integer}
|
|
238
|
+
* (a1 + a2 + 1)/2
|
|
239
|
+
* < {rounding up to a power of 2}
|
|
240
|
+
* 2^128
|
|
241
|
+
*
|
|
242
|
+
* Lemma 4: |k2| < (-b1 + b2)/2 + 1 < 2^128
|
|
243
|
+
*
|
|
244
|
+
* |k2|
|
|
245
|
+
* = {definition of k2}
|
|
246
|
+
* |- c1*a1 - c2*a2|
|
|
247
|
+
* = {(b1*b2 - b1*b2)/n = 0}
|
|
248
|
+
* |k*(b1*b2 - b1*b2)/n - c1*b1 - c2*b2|
|
|
249
|
+
* =
|
|
250
|
+
* |b1*(k*b2/n - c1) + b2*(k*(-b1)/n - c2)|
|
|
251
|
+
* <= {triangle inequality}
|
|
252
|
+
* (-b1)*|k*b2/n - c1| + b2*|k*(-b1)/n - c2|
|
|
253
|
+
* < {Lemma 1 and Lemma 2}
|
|
254
|
+
* (-b1)*(2^-1 + epsilon1) + b2*(2^-1 + epsilon2)
|
|
255
|
+
* < {rounding up to an integer}
|
|
256
|
+
* (-b1 + b2)/2 + 1
|
|
257
|
+
* < {rounding up to a power of 2}
|
|
258
|
+
* 2^128
|
|
259
|
+
*
|
|
260
|
+
* Let
|
|
261
|
+
* - r2 = k2 mod n
|
|
262
|
+
* - r1 = k - r2*lambda mod n.
|
|
263
|
+
*
|
|
264
|
+
* Notice that r1 is defined such that r1 + r2 * lambda == k (mod n).
|
|
265
|
+
*
|
|
266
|
+
* Lemma 5: r1 == k1 mod n.
|
|
267
|
+
*
|
|
268
|
+
* r1
|
|
269
|
+
* == {definition of r1 and r2}
|
|
270
|
+
* k - k2*lambda
|
|
271
|
+
* == {definition of k2}
|
|
272
|
+
* k - (- c1*b1 - c2*b2)*lambda
|
|
273
|
+
* ==
|
|
274
|
+
* k + c1*b1*lambda + c2*b2*lambda
|
|
275
|
+
* == {a1 + b1*lambda == 0 mod n and a2 + b2*lambda == 0 mod n}
|
|
276
|
+
* k - c1*a1 - c2*a2
|
|
277
|
+
* == {definition of k1}
|
|
278
|
+
* k1
|
|
279
|
+
*
|
|
280
|
+
* From Lemma 3, Lemma 4, Lemma 5 and the definition of r2, we can conclude that
|
|
281
|
+
*
|
|
282
|
+
* - either r1 < 2^128 or -r1 mod n < 2^128
|
|
283
|
+
* - either r2 < 2^128 or -r2 mod n < 2^128.
|
|
284
|
+
*
|
|
285
|
+
* Q.E.D.
|
|
286
|
+
*/
|
|
287
|
+
static void secp256k1_scalar_split_lambda_verify(const secp256k1_scalar *r1, const secp256k1_scalar *r2, const secp256k1_scalar *k) {
|
|
288
|
+
secp256k1_scalar s;
|
|
289
|
+
unsigned char buf1[32];
|
|
290
|
+
unsigned char buf2[32];
|
|
291
|
+
|
|
292
|
+
/* (a1 + a2 + 1)/2 is 0xa2a8918ca85bafe22016d0b917e4dd77 */
|
|
293
|
+
static const unsigned char k1_bound[32] = {
|
|
294
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
295
|
+
0xa2, 0xa8, 0x91, 0x8c, 0xa8, 0x5b, 0xaf, 0xe2, 0x20, 0x16, 0xd0, 0xb9, 0x17, 0xe4, 0xdd, 0x77
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
/* (-b1 + b2)/2 + 1 is 0x8a65287bd47179fb2be08846cea267ed */
|
|
299
|
+
static const unsigned char k2_bound[32] = {
|
|
300
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
301
|
+
0x8a, 0x65, 0x28, 0x7b, 0xd4, 0x71, 0x79, 0xfb, 0x2b, 0xe0, 0x88, 0x46, 0xce, 0xa2, 0x67, 0xed
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
secp256k1_scalar_mul(&s, &secp256k1_const_lambda, r2);
|
|
305
|
+
secp256k1_scalar_add(&s, &s, r1);
|
|
306
|
+
VERIFY_CHECK(secp256k1_scalar_eq(&s, k));
|
|
307
|
+
|
|
308
|
+
secp256k1_scalar_negate(&s, r1);
|
|
309
|
+
secp256k1_scalar_get_b32(buf1, r1);
|
|
310
|
+
secp256k1_scalar_get_b32(buf2, &s);
|
|
311
|
+
VERIFY_CHECK(secp256k1_memcmp_var(buf1, k1_bound, 32) < 0 || secp256k1_memcmp_var(buf2, k1_bound, 32) < 0);
|
|
312
|
+
|
|
313
|
+
secp256k1_scalar_negate(&s, r2);
|
|
314
|
+
secp256k1_scalar_get_b32(buf1, r2);
|
|
315
|
+
secp256k1_scalar_get_b32(buf2, &s);
|
|
316
|
+
VERIFY_CHECK(secp256k1_memcmp_var(buf1, k2_bound, 32) < 0 || secp256k1_memcmp_var(buf2, k2_bound, 32) < 0);
|
|
317
|
+
}
|
|
318
|
+
#endif /* VERIFY */
|
|
319
|
+
#endif /* !defined(EXHAUSTIVE_TEST_ORDER) */
|
|
320
|
+
|
|
321
|
+
#endif /* SECP256K1_SCALAR_IMPL_H */
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/***********************************************************************
|
|
2
|
+
* Copyright (c) 2015, 2022 Andrew Poelstra, Pieter Wuille *
|
|
3
|
+
* Distributed under the MIT software license, see the accompanying *
|
|
4
|
+
* file COPYING or https://www.opensource.org/licenses/mit-license.php.*
|
|
5
|
+
***********************************************************************/
|
|
6
|
+
|
|
7
|
+
#ifndef SECP256K1_SCALAR_REPR_H
|
|
8
|
+
#define SECP256K1_SCALAR_REPR_H
|
|
9
|
+
|
|
10
|
+
#include <stdint.h>
|
|
11
|
+
|
|
12
|
+
/** A scalar modulo the group order of the secp256k1 curve. */
|
|
13
|
+
typedef uint32_t secp256k1_scalar;
|
|
14
|
+
|
|
15
|
+
/* A compile-time constant equal to 2^32 (modulo order). */
|
|
16
|
+
#define SCALAR_2P32 ((0xffffffffUL % EXHAUSTIVE_TEST_ORDER) + 1U)
|
|
17
|
+
|
|
18
|
+
/* Compute a*2^32 + b (modulo order). */
|
|
19
|
+
#define SCALAR_HORNER(a, b) (((uint64_t)(a) * SCALAR_2P32 + (b)) % EXHAUSTIVE_TEST_ORDER)
|
|
20
|
+
|
|
21
|
+
/* Evaluates to the provided 256-bit constant reduced modulo order. */
|
|
22
|
+
#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) SCALAR_HORNER(SCALAR_HORNER(SCALAR_HORNER(SCALAR_HORNER(SCALAR_HORNER(SCALAR_HORNER(SCALAR_HORNER((d7), (d6)), (d5)), (d4)), (d3)), (d2)), (d1)), (d0))
|
|
23
|
+
|
|
24
|
+
#endif /* SECP256K1_SCALAR_REPR_H */
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/***********************************************************************
|
|
2
|
+
* Copyright (c) 2015 Andrew Poelstra *
|
|
3
|
+
* Distributed under the MIT software license, see the accompanying *
|
|
4
|
+
* file COPYING or https://www.opensource.org/licenses/mit-license.php.*
|
|
5
|
+
***********************************************************************/
|
|
6
|
+
|
|
7
|
+
#ifndef SECP256K1_SCALAR_REPR_IMPL_H
|
|
8
|
+
#define SECP256K1_SCALAR_REPR_IMPL_H
|
|
9
|
+
|
|
10
|
+
#include "checkmem.h"
|
|
11
|
+
#include "scalar.h"
|
|
12
|
+
#include "util.h"
|
|
13
|
+
|
|
14
|
+
#include <string.h>
|
|
15
|
+
|
|
16
|
+
SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) {
|
|
17
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
18
|
+
|
|
19
|
+
return !(*a & 1);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) {
|
|
23
|
+
*r = v % EXHAUSTIVE_TEST_ORDER;
|
|
24
|
+
|
|
25
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
SECP256K1_INLINE static uint32_t secp256k1_scalar_get_bits_limb32(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {
|
|
29
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
30
|
+
|
|
31
|
+
VERIFY_CHECK(count > 0 && count <= 32);
|
|
32
|
+
if (offset < 32) {
|
|
33
|
+
return (*a >> offset) & (0xFFFFFFFF >> (32 - count));
|
|
34
|
+
} else {
|
|
35
|
+
return 0;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
SECP256K1_INLINE static uint32_t secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {
|
|
40
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
41
|
+
|
|
42
|
+
return secp256k1_scalar_get_bits_limb32(a, offset, count);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { return *a >= EXHAUSTIVE_TEST_ORDER; }
|
|
46
|
+
|
|
47
|
+
static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {
|
|
48
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
49
|
+
SECP256K1_SCALAR_VERIFY(b);
|
|
50
|
+
|
|
51
|
+
*r = (*a + *b) % EXHAUSTIVE_TEST_ORDER;
|
|
52
|
+
|
|
53
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
54
|
+
return *r < *b;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) {
|
|
58
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
59
|
+
|
|
60
|
+
if (flag && bit < 32)
|
|
61
|
+
*r += ((uint32_t)1 << bit);
|
|
62
|
+
|
|
63
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
64
|
+
VERIFY_CHECK(bit < 32);
|
|
65
|
+
/* Verify that adding (1 << bit) will not overflow any in-range scalar *r by overflowing the underlying uint32_t. */
|
|
66
|
+
VERIFY_CHECK(((uint32_t)1 << bit) - 1 <= UINT32_MAX - EXHAUSTIVE_TEST_ORDER);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) {
|
|
70
|
+
int i;
|
|
71
|
+
int over = 0;
|
|
72
|
+
*r = 0;
|
|
73
|
+
for (i = 0; i < 32; i++) {
|
|
74
|
+
*r = (*r * 0x100) + b32[i];
|
|
75
|
+
if (*r >= EXHAUSTIVE_TEST_ORDER) {
|
|
76
|
+
over = 1;
|
|
77
|
+
*r %= EXHAUSTIVE_TEST_ORDER;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (overflow) *overflow = over;
|
|
81
|
+
|
|
82
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) {
|
|
86
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
87
|
+
|
|
88
|
+
memset(bin, 0, 32);
|
|
89
|
+
bin[28] = *a >> 24; bin[29] = *a >> 16; bin[30] = *a >> 8; bin[31] = *a;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) {
|
|
93
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
94
|
+
|
|
95
|
+
return *a == 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) {
|
|
99
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
100
|
+
|
|
101
|
+
if (*a == 0) {
|
|
102
|
+
*r = 0;
|
|
103
|
+
} else {
|
|
104
|
+
*r = EXHAUSTIVE_TEST_ORDER - *a;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) {
|
|
111
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
112
|
+
|
|
113
|
+
return *a == 1;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static int secp256k1_scalar_is_high(const secp256k1_scalar *a) {
|
|
117
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
118
|
+
|
|
119
|
+
return *a > EXHAUSTIVE_TEST_ORDER / 2;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {
|
|
123
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
124
|
+
|
|
125
|
+
if (flag) secp256k1_scalar_negate(r, r);
|
|
126
|
+
|
|
127
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
128
|
+
return flag ? -1 : 1;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {
|
|
132
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
133
|
+
SECP256K1_SCALAR_VERIFY(b);
|
|
134
|
+
|
|
135
|
+
*r = (*a * *b) % EXHAUSTIVE_TEST_ORDER;
|
|
136
|
+
|
|
137
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) {
|
|
141
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
142
|
+
|
|
143
|
+
*r1 = *a;
|
|
144
|
+
*r2 = 0;
|
|
145
|
+
|
|
146
|
+
SECP256K1_SCALAR_VERIFY(r1);
|
|
147
|
+
SECP256K1_SCALAR_VERIFY(r2);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) {
|
|
151
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
152
|
+
SECP256K1_SCALAR_VERIFY(b);
|
|
153
|
+
|
|
154
|
+
return *a == *b;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
static SECP256K1_INLINE void secp256k1_scalar_cmov(secp256k1_scalar *r, const secp256k1_scalar *a, int flag) {
|
|
158
|
+
uint32_t mask0, mask1;
|
|
159
|
+
volatile int vflag = flag;
|
|
160
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
161
|
+
SECP256K1_CHECKMEM_CHECK_VERIFY(r, sizeof(*r));
|
|
162
|
+
|
|
163
|
+
mask0 = vflag + ~((uint32_t)0);
|
|
164
|
+
mask1 = ~mask0;
|
|
165
|
+
*r = (*r & mask0) | (*a & mask1);
|
|
166
|
+
|
|
167
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *x) {
|
|
171
|
+
int i;
|
|
172
|
+
uint32_t res = 0;
|
|
173
|
+
SECP256K1_SCALAR_VERIFY(x);
|
|
174
|
+
|
|
175
|
+
for (i = 0; i < EXHAUSTIVE_TEST_ORDER; i++) {
|
|
176
|
+
if ((i * *x) % EXHAUSTIVE_TEST_ORDER == 1) {
|
|
177
|
+
res = i;
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* If this VERIFY_CHECK triggers we were given a noninvertible scalar (and thus
|
|
183
|
+
* have a composite group order; fix it in exhaustive_tests.c). */
|
|
184
|
+
VERIFY_CHECK(res != 0);
|
|
185
|
+
*r = res;
|
|
186
|
+
|
|
187
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) {
|
|
191
|
+
SECP256K1_SCALAR_VERIFY(x);
|
|
192
|
+
|
|
193
|
+
secp256k1_scalar_inverse(r, x);
|
|
194
|
+
|
|
195
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
static void secp256k1_scalar_half(secp256k1_scalar *r, const secp256k1_scalar *a) {
|
|
199
|
+
SECP256K1_SCALAR_VERIFY(a);
|
|
200
|
+
|
|
201
|
+
*r = (*a + ((-(uint32_t)(*a & 1)) & EXHAUSTIVE_TEST_ORDER)) >> 1;
|
|
202
|
+
|
|
203
|
+
SECP256K1_SCALAR_VERIFY(r);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
#endif /* SECP256K1_SCALAR_REPR_IMPL_H */
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/***********************************************************************
|
|
2
|
+
* Copyright (c) 2017 Andrew Poelstra *
|
|
3
|
+
* Distributed under the MIT software license, see the accompanying *
|
|
4
|
+
* file COPYING or https://www.opensource.org/licenses/mit-license.php.*
|
|
5
|
+
***********************************************************************/
|
|
6
|
+
|
|
7
|
+
#ifndef SECP256K1_SCRATCH_H
|
|
8
|
+
#define SECP256K1_SCRATCH_H
|
|
9
|
+
|
|
10
|
+
/* The typedef is used internally; the struct name is used in the public API
|
|
11
|
+
* (where it is exposed as a different typedef) */
|
|
12
|
+
typedef struct secp256k1_scratch_space_struct {
|
|
13
|
+
/** guard against interpreting this object as other types */
|
|
14
|
+
unsigned char magic[8];
|
|
15
|
+
/** actual allocated data */
|
|
16
|
+
void *data;
|
|
17
|
+
/** amount that has been allocated (i.e. `data + offset` is the next
|
|
18
|
+
* available pointer) */
|
|
19
|
+
size_t alloc_size;
|
|
20
|
+
/** maximum size available to allocate */
|
|
21
|
+
size_t max_size;
|
|
22
|
+
} secp256k1_scratch;
|
|
23
|
+
|
|
24
|
+
typedef struct secp256k1_scratch_space_struct secp256k1_scratch_space;
|
|
25
|
+
|
|
26
|
+
static secp256k1_scratch* secp256k1_scratch_create(const secp256k1_callback* error_callback, size_t max_size);
|
|
27
|
+
|
|
28
|
+
static void secp256k1_scratch_destroy(const secp256k1_callback* error_callback, secp256k1_scratch* scratch);
|
|
29
|
+
|
|
30
|
+
/** Returns an opaque object used to "checkpoint" a scratch space. Used
|
|
31
|
+
* with `secp256k1_scratch_apply_checkpoint` to undo allocations. */
|
|
32
|
+
static size_t secp256k1_scratch_checkpoint(const secp256k1_callback* error_callback, const secp256k1_scratch* scratch);
|
|
33
|
+
|
|
34
|
+
/** Applies a check point received from `secp256k1_scratch_checkpoint`,
|
|
35
|
+
* undoing all allocations since that point. */
|
|
36
|
+
static void secp256k1_scratch_apply_checkpoint(const secp256k1_callback* error_callback, secp256k1_scratch* scratch, size_t checkpoint);
|
|
37
|
+
|
|
38
|
+
/** Returns the maximum allocation the scratch space will allow */
|
|
39
|
+
static size_t secp256k1_scratch_max_allocation(const secp256k1_callback* error_callback, const secp256k1_scratch* scratch, size_t n_objects);
|
|
40
|
+
|
|
41
|
+
/** Returns a pointer into the most recently allocated frame, or NULL if there is insufficient available space */
|
|
42
|
+
static void *secp256k1_scratch_alloc(const secp256k1_callback* error_callback, secp256k1_scratch* scratch, size_t n);
|
|
43
|
+
|
|
44
|
+
#endif
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/***********************************************************************
|
|
2
|
+
* Copyright (c) 2017 Andrew Poelstra *
|
|
3
|
+
* Distributed under the MIT software license, see the accompanying *
|
|
4
|
+
* file COPYING or https://www.opensource.org/licenses/mit-license.php.*
|
|
5
|
+
***********************************************************************/
|
|
6
|
+
|
|
7
|
+
#ifndef SECP256K1_SCRATCH_IMPL_H
|
|
8
|
+
#define SECP256K1_SCRATCH_IMPL_H
|
|
9
|
+
|
|
10
|
+
#include "util.h"
|
|
11
|
+
#include "scratch.h"
|
|
12
|
+
|
|
13
|
+
static secp256k1_scratch* secp256k1_scratch_create(const secp256k1_callback* error_callback, size_t size) {
|
|
14
|
+
const size_t base_alloc = ROUND_TO_ALIGN(sizeof(secp256k1_scratch));
|
|
15
|
+
void *alloc = checked_malloc(error_callback, base_alloc + size);
|
|
16
|
+
secp256k1_scratch* ret = (secp256k1_scratch *)alloc;
|
|
17
|
+
if (ret != NULL) {
|
|
18
|
+
memset(ret, 0, sizeof(*ret));
|
|
19
|
+
memcpy(ret->magic, "scratch", 8);
|
|
20
|
+
ret->data = (void *) ((char *) alloc + base_alloc);
|
|
21
|
+
ret->max_size = size;
|
|
22
|
+
}
|
|
23
|
+
return ret;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
static void secp256k1_scratch_destroy(const secp256k1_callback* error_callback, secp256k1_scratch* scratch) {
|
|
27
|
+
if (scratch != NULL) {
|
|
28
|
+
if (secp256k1_memcmp_var(scratch->magic, "scratch", 8) != 0) {
|
|
29
|
+
secp256k1_callback_call(error_callback, "invalid scratch space");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
VERIFY_CHECK(scratch->alloc_size == 0); /* all checkpoints should be applied */
|
|
33
|
+
memset(scratch->magic, 0, sizeof(scratch->magic));
|
|
34
|
+
free(scratch);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static size_t secp256k1_scratch_checkpoint(const secp256k1_callback* error_callback, const secp256k1_scratch* scratch) {
|
|
39
|
+
if (secp256k1_memcmp_var(scratch->magic, "scratch", 8) != 0) {
|
|
40
|
+
secp256k1_callback_call(error_callback, "invalid scratch space");
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
return scratch->alloc_size;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static void secp256k1_scratch_apply_checkpoint(const secp256k1_callback* error_callback, secp256k1_scratch* scratch, size_t checkpoint) {
|
|
47
|
+
if (secp256k1_memcmp_var(scratch->magic, "scratch", 8) != 0) {
|
|
48
|
+
secp256k1_callback_call(error_callback, "invalid scratch space");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (checkpoint > scratch->alloc_size) {
|
|
52
|
+
secp256k1_callback_call(error_callback, "invalid checkpoint");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
scratch->alloc_size = checkpoint;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static size_t secp256k1_scratch_max_allocation(const secp256k1_callback* error_callback, const secp256k1_scratch* scratch, size_t objects) {
|
|
59
|
+
if (secp256k1_memcmp_var(scratch->magic, "scratch", 8) != 0) {
|
|
60
|
+
secp256k1_callback_call(error_callback, "invalid scratch space");
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
/* Ensure that multiplication will not wrap around */
|
|
64
|
+
if (ALIGNMENT > 1 && objects > SIZE_MAX/(ALIGNMENT - 1)) {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
if (scratch->max_size - scratch->alloc_size <= objects * (ALIGNMENT - 1)) {
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
return scratch->max_size - scratch->alloc_size - objects * (ALIGNMENT - 1);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
static void *secp256k1_scratch_alloc(const secp256k1_callback* error_callback, secp256k1_scratch* scratch, size_t size) {
|
|
74
|
+
void *ret;
|
|
75
|
+
size_t rounded_size;
|
|
76
|
+
|
|
77
|
+
rounded_size = ROUND_TO_ALIGN(size);
|
|
78
|
+
/* Check that rounding did not wrap around */
|
|
79
|
+
if (rounded_size < size) {
|
|
80
|
+
return NULL;
|
|
81
|
+
}
|
|
82
|
+
size = rounded_size;
|
|
83
|
+
|
|
84
|
+
if (secp256k1_memcmp_var(scratch->magic, "scratch", 8) != 0) {
|
|
85
|
+
secp256k1_callback_call(error_callback, "invalid scratch space");
|
|
86
|
+
return NULL;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (size > scratch->max_size - scratch->alloc_size) {
|
|
90
|
+
return NULL;
|
|
91
|
+
}
|
|
92
|
+
ret = (void *) ((char *) scratch->data + scratch->alloc_size);
|
|
93
|
+
memset(ret, 0, size);
|
|
94
|
+
scratch->alloc_size += size;
|
|
95
|
+
|
|
96
|
+
return ret;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
#endif
|