@authon/react-native-wallet 0.0.0-stage → 0.1.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.
Files changed (159) hide show
  1. package/README.md +221 -2
  2. package/android/build.gradle +40 -0
  3. package/android/consumer-rules.pro +10 -0
  4. package/android/src/main/AndroidManifest.xml +4 -0
  5. package/android/src/main/java/dev/authon/reactnative/wallet/AuthonWalletModule.kt +181 -0
  6. package/android/src/vendor/GENERATED.md +4 -0
  7. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/AuthonWallet.kt +191 -0
  8. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Bytes.kt +74 -0
  9. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/CredentialManagerPasskeys.kt +192 -0
  10. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/DeviceStore.kt +170 -0
  11. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/DialogWalletApprover.kt +141 -0
  12. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Eip712.kt +176 -0
  13. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/EvmAccount.kt +45 -0
  14. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/EvmTransaction.kt +180 -0
  15. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/GfTables.kt +44 -0
  16. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/HdWallet.kt +130 -0
  17. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Http.kt +82 -0
  18. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/JsValues.kt +83 -0
  19. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/KeystoreDeviceStore.kt +232 -0
  20. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Prf.kt +111 -0
  21. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Proof.kt +134 -0
  22. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Shamir.kt +106 -0
  23. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/SignSummary.kt +335 -0
  24. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletApi.kt +353 -0
  25. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletError.kt +58 -0
  26. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletOps.kt +449 -0
  27. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletTypes.kt +71 -0
  28. package/build/authonContext.d.ts +19 -0
  29. package/build/authonContext.d.ts.map +1 -0
  30. package/build/authonContext.js +20 -0
  31. package/build/authonContext.js.map +1 -0
  32. package/build/client.d.ts +76 -0
  33. package/build/client.d.ts.map +1 -0
  34. package/build/client.js +349 -0
  35. package/build/client.js.map +1 -0
  36. package/build/errors.d.ts +18 -0
  37. package/build/errors.d.ts.map +1 -0
  38. package/build/errors.js +9 -0
  39. package/build/errors.js.map +1 -0
  40. package/build/index.d.ts +7 -0
  41. package/build/index.d.ts.map +1 -0
  42. package/build/index.js +4 -0
  43. package/build/index.js.map +1 -0
  44. package/build/native.d.ts +39 -0
  45. package/build/native.d.ts.map +1 -0
  46. package/build/native.js +12 -0
  47. package/build/native.js.map +1 -0
  48. package/build/types.d.ts +121 -0
  49. package/build/types.d.ts.map +1 -0
  50. package/build/types.js +3 -0
  51. package/build/types.js.map +1 -0
  52. package/build/useAuthonWallet.d.ts +25 -0
  53. package/build/useAuthonWallet.d.ts.map +1 -0
  54. package/build/useAuthonWallet.js +77 -0
  55. package/build/useAuthonWallet.js.map +1 -0
  56. package/expo-module.config.json +9 -0
  57. package/ios/AuthonReactNativeWallet.podspec +37 -0
  58. package/ios/AuthonWalletModule.swift +190 -0
  59. package/ios/vendor/AuthonWallet/AuthonWallet.swift +212 -0
  60. package/ios/vendor/AuthonWallet/Crypto/BIP39Wordlist.swift +262 -0
  61. package/ios/vendor/AuthonWallet/Crypto/HDKey.swift +108 -0
  62. package/ios/vendor/AuthonWallet/Crypto/Secp256k1.swift +104 -0
  63. package/ios/vendor/AuthonWallet/Crypto/Shamir.swift +123 -0
  64. package/ios/vendor/AuthonWallet/EVM/Address.swift +57 -0
  65. package/ios/vendor/AuthonWallet/EVM/EvmAccount.swift +48 -0
  66. package/ios/vendor/AuthonWallet/EVM/Transaction.swift +165 -0
  67. package/ios/vendor/AuthonWallet/EVM/TypedData.swift +193 -0
  68. package/ios/vendor/AuthonWallet/Support/BigInteger.swift +220 -0
  69. package/ios/vendor/AuthonWallet/Support/Bytes.swift +89 -0
  70. package/ios/vendor/AuthonWallet/Support/JSONValue.swift +341 -0
  71. package/ios/vendor/AuthonWallet/UI/WalletApprover.swift +250 -0
  72. package/ios/vendor/AuthonWallet/Wallet/Backup.swift +69 -0
  73. package/ios/vendor/AuthonWallet/Wallet/DeviceStore.swift +351 -0
  74. package/ios/vendor/AuthonWallet/Wallet/Passkeys.swift +190 -0
  75. package/ios/vendor/AuthonWallet/Wallet/Proof.swift +143 -0
  76. package/ios/vendor/AuthonWallet/Wallet/Shares.swift +116 -0
  77. package/ios/vendor/AuthonWallet/Wallet/Summary.swift +342 -0
  78. package/ios/vendor/AuthonWallet/Wallet/WalletAPI.swift +350 -0
  79. package/ios/vendor/AuthonWallet/Wallet/WalletOps.swift +555 -0
  80. package/ios/vendor/AuthonWallet/WalletError.swift +54 -0
  81. package/ios/vendor/CKeccak/LICENSE +22 -0
  82. package/ios/vendor/CKeccak/README.md +27 -0
  83. package/ios/vendor/CKeccak/byte_order.h +59 -0
  84. package/ios/vendor/CKeccak/include/ckeccak.h +9 -0
  85. package/ios/vendor/CKeccak/memzero.c +75 -0
  86. package/ios/vendor/CKeccak/memzero.h +8 -0
  87. package/ios/vendor/CKeccak/options.h +99 -0
  88. package/ios/vendor/CKeccak/sha3.c +413 -0
  89. package/ios/vendor/CKeccak/sha3.h +89 -0
  90. package/ios/vendor/CSecp256k1/COPYING +19 -0
  91. package/ios/vendor/CSecp256k1/README.md +35 -0
  92. package/ios/vendor/CSecp256k1/build/precomputed_ecmult.c +3 -0
  93. package/ios/vendor/CSecp256k1/build/precomputed_ecmult_gen.c +3 -0
  94. package/ios/vendor/CSecp256k1/build/secp256k1.c +3 -0
  95. package/ios/vendor/CSecp256k1/include/secp256k1.h +899 -0
  96. package/ios/vendor/CSecp256k1/include/secp256k1_preallocated.h +134 -0
  97. package/ios/vendor/CSecp256k1/include/secp256k1_recovery.h +113 -0
  98. package/ios/vendor/CSecp256k1/src/assumptions.h +87 -0
  99. package/ios/vendor/CSecp256k1/src/checkmem.h +102 -0
  100. package/ios/vendor/CSecp256k1/src/ecdsa.h +21 -0
  101. package/ios/vendor/CSecp256k1/src/ecdsa_impl.h +304 -0
  102. package/ios/vendor/CSecp256k1/src/eckey.h +25 -0
  103. package/ios/vendor/CSecp256k1/src/eckey_impl.h +92 -0
  104. package/ios/vendor/CSecp256k1/src/ecmult.h +61 -0
  105. package/ios/vendor/CSecp256k1/src/ecmult_const.h +38 -0
  106. package/ios/vendor/CSecp256k1/src/ecmult_const_impl.h +399 -0
  107. package/ios/vendor/CSecp256k1/src/ecmult_gen.h +143 -0
  108. package/ios/vendor/CSecp256k1/src/ecmult_gen_impl.h +341 -0
  109. package/ios/vendor/CSecp256k1/src/ecmult_impl.h +853 -0
  110. package/ios/vendor/CSecp256k1/src/field.h +350 -0
  111. package/ios/vendor/CSecp256k1/src/field_10x26.h +57 -0
  112. package/ios/vendor/CSecp256k1/src/field_10x26_impl.h +1232 -0
  113. package/ios/vendor/CSecp256k1/src/field_5x52.h +62 -0
  114. package/ios/vendor/CSecp256k1/src/field_5x52_impl.h +522 -0
  115. package/ios/vendor/CSecp256k1/src/field_5x52_int128_impl.h +274 -0
  116. package/ios/vendor/CSecp256k1/src/field_impl.h +457 -0
  117. package/ios/vendor/CSecp256k1/src/group.h +212 -0
  118. package/ios/vendor/CSecp256k1/src/group_impl.h +974 -0
  119. package/ios/vendor/CSecp256k1/src/hash.h +44 -0
  120. package/ios/vendor/CSecp256k1/src/hash_impl.h +299 -0
  121. package/ios/vendor/CSecp256k1/src/hsort.h +33 -0
  122. package/ios/vendor/CSecp256k1/src/hsort_impl.h +125 -0
  123. package/ios/vendor/CSecp256k1/src/int128.h +90 -0
  124. package/ios/vendor/CSecp256k1/src/int128_impl.h +18 -0
  125. package/ios/vendor/CSecp256k1/src/int128_native.h +19 -0
  126. package/ios/vendor/CSecp256k1/src/int128_native_impl.h +94 -0
  127. package/ios/vendor/CSecp256k1/src/int128_struct.h +14 -0
  128. package/ios/vendor/CSecp256k1/src/int128_struct_impl.h +205 -0
  129. package/ios/vendor/CSecp256k1/src/modinv32.h +43 -0
  130. package/ios/vendor/CSecp256k1/src/modinv32_impl.h +725 -0
  131. package/ios/vendor/CSecp256k1/src/modinv64.h +47 -0
  132. package/ios/vendor/CSecp256k1/src/modinv64_impl.h +780 -0
  133. package/ios/vendor/CSecp256k1/src/modules/recovery/main_impl.h +159 -0
  134. package/ios/vendor/CSecp256k1/src/precomputed_ecmult.c +16456 -0
  135. package/ios/vendor/CSecp256k1/src/precomputed_ecmult.h +38 -0
  136. package/ios/vendor/CSecp256k1/src/precomputed_ecmult_gen.c +1779 -0
  137. package/ios/vendor/CSecp256k1/src/precomputed_ecmult_gen.h +26 -0
  138. package/ios/vendor/CSecp256k1/src/scalar.h +105 -0
  139. package/ios/vendor/CSecp256k1/src/scalar_4x64.h +19 -0
  140. package/ios/vendor/CSecp256k1/src/scalar_4x64_impl.h +1000 -0
  141. package/ios/vendor/CSecp256k1/src/scalar_8x32.h +19 -0
  142. package/ios/vendor/CSecp256k1/src/scalar_8x32_impl.h +816 -0
  143. package/ios/vendor/CSecp256k1/src/scalar_impl.h +321 -0
  144. package/ios/vendor/CSecp256k1/src/scalar_low.h +24 -0
  145. package/ios/vendor/CSecp256k1/src/scalar_low_impl.h +206 -0
  146. package/ios/vendor/CSecp256k1/src/scratch.h +44 -0
  147. package/ios/vendor/CSecp256k1/src/scratch_impl.h +99 -0
  148. package/ios/vendor/CSecp256k1/src/secp256k1.c +831 -0
  149. package/ios/vendor/CSecp256k1/src/selftest.h +32 -0
  150. package/ios/vendor/CSecp256k1/src/util.h +451 -0
  151. package/ios/vendor/GENERATED.md +4 -0
  152. package/package.json +65 -3
  153. package/src/authonContext.ts +30 -0
  154. package/src/client.ts +375 -0
  155. package/src/errors.ts +52 -0
  156. package/src/index.ts +21 -0
  157. package/src/native.ts +50 -0
  158. package/src/types.ts +120 -0
  159. package/src/useAuthonWallet.ts +103 -0
@@ -0,0 +1,304 @@
1
+ /***********************************************************************
2
+ * Copyright (c) 2013-2015 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
+
8
+ #ifndef SECP256K1_ECDSA_IMPL_H
9
+ #define SECP256K1_ECDSA_IMPL_H
10
+
11
+ #include "scalar.h"
12
+ #include "field.h"
13
+ #include "group.h"
14
+ #include "ecmult.h"
15
+ #include "ecmult_gen.h"
16
+ #include "ecdsa.h"
17
+
18
+ /** Group order for secp256k1 defined as 'n' in "Standards for Efficient Cryptography" (SEC2) 2.7.1
19
+ * $ sage -c 'load("secp256k1_params.sage"); print(hex(N))'
20
+ * 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
21
+ */
22
+ static const secp256k1_fe secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST(
23
+ 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL,
24
+ 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364141UL
25
+ );
26
+
27
+ /** Difference between field and order, values 'p' and 'n' values defined in
28
+ * "Standards for Efficient Cryptography" (SEC2) 2.7.1.
29
+ * $ sage -c 'load("secp256k1_params.sage"); print(hex(P-N))'
30
+ * 0x14551231950b75fc4402da1722fc9baee
31
+ */
32
+ static const secp256k1_fe secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST(
33
+ 0, 0, 0, 1, 0x45512319UL, 0x50B75FC4UL, 0x402DA172UL, 0x2FC9BAEEUL
34
+ );
35
+
36
+ static int secp256k1_der_read_len(size_t *len, const unsigned char **sigp, const unsigned char *sigend) {
37
+ size_t lenleft;
38
+ unsigned char b1;
39
+ VERIFY_CHECK(len != NULL);
40
+ *len = 0;
41
+ if (*sigp >= sigend) {
42
+ return 0;
43
+ }
44
+ b1 = *((*sigp)++);
45
+ if (b1 == 0xFF) {
46
+ /* X.690-0207 8.1.3.5.c the value 0xFF shall not be used. */
47
+ return 0;
48
+ }
49
+ if ((b1 & 0x80) == 0) {
50
+ /* X.690-0207 8.1.3.4 short form length octets */
51
+ *len = b1;
52
+ return 1;
53
+ }
54
+ if (b1 == 0x80) {
55
+ /* Indefinite length is not allowed in DER. */
56
+ return 0;
57
+ }
58
+ /* X.690-207 8.1.3.5 long form length octets */
59
+ lenleft = b1 & 0x7F; /* lenleft is at least 1 */
60
+ if (lenleft > (size_t)(sigend - *sigp)) {
61
+ return 0;
62
+ }
63
+ if (**sigp == 0) {
64
+ /* Not the shortest possible length encoding. */
65
+ return 0;
66
+ }
67
+ if (lenleft > sizeof(size_t)) {
68
+ /* The resulting length would exceed the range of a size_t, so
69
+ * it is certainly longer than the passed array size. */
70
+ return 0;
71
+ }
72
+ while (lenleft > 0) {
73
+ *len = (*len << 8) | **sigp;
74
+ (*sigp)++;
75
+ lenleft--;
76
+ }
77
+ if (*len > (size_t)(sigend - *sigp)) {
78
+ /* Result exceeds the length of the passed array.
79
+ (Checking this is the responsibility of the caller but it
80
+ can't hurt do it here, too.) */
81
+ return 0;
82
+ }
83
+ if (*len < 128) {
84
+ /* Not the shortest possible length encoding. */
85
+ return 0;
86
+ }
87
+ return 1;
88
+ }
89
+
90
+ static int secp256k1_der_parse_integer(secp256k1_scalar *r, const unsigned char **sig, const unsigned char *sigend) {
91
+ int overflow = 0;
92
+ unsigned char ra[32] = {0};
93
+ size_t rlen;
94
+
95
+ if (*sig == sigend || **sig != 0x02) {
96
+ /* Not a primitive integer (X.690-0207 8.3.1). */
97
+ return 0;
98
+ }
99
+ (*sig)++;
100
+ if (secp256k1_der_read_len(&rlen, sig, sigend) == 0) {
101
+ return 0;
102
+ }
103
+ if (rlen == 0 || rlen > (size_t)(sigend - *sig)) {
104
+ /* Exceeds bounds or not at least length 1 (X.690-0207 8.3.1). */
105
+ return 0;
106
+ }
107
+ if (**sig == 0x00 && rlen > 1 && (((*sig)[1]) & 0x80) == 0x00) {
108
+ /* Excessive 0x00 padding. */
109
+ return 0;
110
+ }
111
+ if (**sig == 0xFF && rlen > 1 && (((*sig)[1]) & 0x80) == 0x80) {
112
+ /* Excessive 0xFF padding. */
113
+ return 0;
114
+ }
115
+ if ((**sig & 0x80) == 0x80) {
116
+ /* Negative. */
117
+ overflow = 1;
118
+ }
119
+ /* There is at most one leading zero byte:
120
+ * if there were two leading zero bytes, we would have failed and returned 0
121
+ * because of excessive 0x00 padding already. */
122
+ if (rlen > 0 && **sig == 0) {
123
+ /* Skip leading zero byte */
124
+ rlen--;
125
+ (*sig)++;
126
+ }
127
+ if (rlen > 32) {
128
+ overflow = 1;
129
+ }
130
+ if (!overflow) {
131
+ if (rlen) memcpy(ra + 32 - rlen, *sig, rlen);
132
+ secp256k1_scalar_set_b32(r, ra, &overflow);
133
+ }
134
+ if (overflow) {
135
+ secp256k1_scalar_set_int(r, 0);
136
+ }
137
+ (*sig) += rlen;
138
+ return 1;
139
+ }
140
+
141
+ static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *rr, secp256k1_scalar *rs, const unsigned char *sig, size_t size) {
142
+ const unsigned char *sigend = sig + size;
143
+ size_t rlen;
144
+ if (sig == sigend || *(sig++) != 0x30) {
145
+ /* The encoding doesn't start with a constructed sequence (X.690-0207 8.9.1). */
146
+ return 0;
147
+ }
148
+ if (secp256k1_der_read_len(&rlen, &sig, sigend) == 0) {
149
+ return 0;
150
+ }
151
+ if (rlen != (size_t)(sigend - sig)) {
152
+ /* Tuple exceeds bounds or garage after tuple. */
153
+ return 0;
154
+ }
155
+
156
+ if (!secp256k1_der_parse_integer(rr, &sig, sigend)) {
157
+ return 0;
158
+ }
159
+ if (!secp256k1_der_parse_integer(rs, &sig, sigend)) {
160
+ return 0;
161
+ }
162
+
163
+ if (sig != sigend) {
164
+ /* Trailing garbage inside tuple. */
165
+ return 0;
166
+ }
167
+
168
+ return 1;
169
+ }
170
+
171
+ static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar* ar, const secp256k1_scalar* as) {
172
+ unsigned char r[33] = {0}, s[33] = {0};
173
+ unsigned char *rp = r, *sp = s;
174
+ size_t lenR = 33, lenS = 33;
175
+ secp256k1_scalar_get_b32(&r[1], ar);
176
+ secp256k1_scalar_get_b32(&s[1], as);
177
+ while (lenR > 1 && rp[0] == 0 && rp[1] < 0x80) { lenR--; rp++; }
178
+ while (lenS > 1 && sp[0] == 0 && sp[1] < 0x80) { lenS--; sp++; }
179
+ if (*size < 6+lenS+lenR) {
180
+ *size = 6 + lenS + lenR;
181
+ return 0;
182
+ }
183
+ *size = 6 + lenS + lenR;
184
+ sig[0] = 0x30;
185
+ sig[1] = 4 + lenS + lenR;
186
+ sig[2] = 0x02;
187
+ sig[3] = lenR;
188
+ memcpy(sig+4, rp, lenR);
189
+ sig[4+lenR] = 0x02;
190
+ sig[5+lenR] = lenS;
191
+ memcpy(sig+lenR+6, sp, lenS);
192
+ return 1;
193
+ }
194
+
195
+ static int secp256k1_ecdsa_sig_verify(const secp256k1_scalar *sigr, const secp256k1_scalar *sigs, const secp256k1_ge *pubkey, const secp256k1_scalar *message) {
196
+ unsigned char c[32];
197
+ secp256k1_scalar sn, u1, u2;
198
+ #if !defined(EXHAUSTIVE_TEST_ORDER)
199
+ secp256k1_fe xr;
200
+ #endif
201
+ secp256k1_gej pubkeyj;
202
+ secp256k1_gej pr;
203
+
204
+ if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) {
205
+ return 0;
206
+ }
207
+
208
+ secp256k1_scalar_inverse_var(&sn, sigs);
209
+ secp256k1_scalar_mul(&u1, &sn, message);
210
+ secp256k1_scalar_mul(&u2, &sn, sigr);
211
+ secp256k1_gej_set_ge(&pubkeyj, pubkey);
212
+ secp256k1_ecmult(&pr, &pubkeyj, &u2, &u1);
213
+ if (secp256k1_gej_is_infinity(&pr)) {
214
+ return 0;
215
+ }
216
+
217
+ #if defined(EXHAUSTIVE_TEST_ORDER)
218
+ {
219
+ secp256k1_scalar computed_r;
220
+ secp256k1_ge pr_ge;
221
+ secp256k1_ge_set_gej(&pr_ge, &pr);
222
+ secp256k1_fe_normalize(&pr_ge.x);
223
+
224
+ secp256k1_fe_get_b32(c, &pr_ge.x);
225
+ secp256k1_scalar_set_b32(&computed_r, c, NULL);
226
+ return secp256k1_scalar_eq(sigr, &computed_r);
227
+ }
228
+ #else
229
+ secp256k1_scalar_get_b32(c, sigr);
230
+ /* we can ignore the fe_set_b32_limit return value, because we know the input is in range */
231
+ (void)secp256k1_fe_set_b32_limit(&xr, c);
232
+
233
+ /** We now have the recomputed R point in pr, and its claimed x coordinate (modulo n)
234
+ * in xr. Naively, we would extract the x coordinate from pr (requiring a inversion modulo p),
235
+ * compute the remainder modulo n, and compare it to xr. However:
236
+ *
237
+ * xr == X(pr) mod n
238
+ * <=> exists h. (xr + h * n < p && xr + h * n == X(pr))
239
+ * [Since 2 * n > p, h can only be 0 or 1]
240
+ * <=> (xr == X(pr)) || (xr + n < p && xr + n == X(pr))
241
+ * [In Jacobian coordinates, X(pr) is pr.x / pr.z^2 mod p]
242
+ * <=> (xr == pr.x / pr.z^2 mod p) || (xr + n < p && xr + n == pr.x / pr.z^2 mod p)
243
+ * [Multiplying both sides of the equations by pr.z^2 mod p]
244
+ * <=> (xr * pr.z^2 mod p == pr.x) || (xr + n < p && (xr + n) * pr.z^2 mod p == pr.x)
245
+ *
246
+ * Thus, we can avoid the inversion, but we have to check both cases separately.
247
+ * secp256k1_gej_eq_x implements the (xr * pr.z^2 mod p == pr.x) test.
248
+ */
249
+ if (secp256k1_gej_eq_x_var(&xr, &pr)) {
250
+ /* xr * pr.z^2 mod p == pr.x, so the signature is valid. */
251
+ return 1;
252
+ }
253
+ if (secp256k1_fe_cmp_var(&xr, &secp256k1_ecdsa_const_p_minus_order) >= 0) {
254
+ /* xr + n >= p, so we can skip testing the second case. */
255
+ return 0;
256
+ }
257
+ secp256k1_fe_add(&xr, &secp256k1_ecdsa_const_order_as_fe);
258
+ if (secp256k1_gej_eq_x_var(&xr, &pr)) {
259
+ /* (xr + n) * pr.z^2 mod p == pr.x, so the signature is valid. */
260
+ return 1;
261
+ }
262
+ return 0;
263
+ #endif
264
+ }
265
+
266
+ static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid) {
267
+ unsigned char b[32];
268
+ secp256k1_gej rp;
269
+ secp256k1_ge r;
270
+ secp256k1_scalar n;
271
+ int overflow = 0;
272
+ int high;
273
+
274
+ secp256k1_ecmult_gen(ctx, &rp, nonce);
275
+ secp256k1_ge_set_gej(&r, &rp);
276
+ secp256k1_fe_normalize(&r.x);
277
+ secp256k1_fe_normalize(&r.y);
278
+ secp256k1_fe_get_b32(b, &r.x);
279
+ secp256k1_scalar_set_b32(sigr, b, &overflow);
280
+ if (recid) {
281
+ /* The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log
282
+ * of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria.
283
+ */
284
+ *recid = (overflow << 1) | secp256k1_fe_is_odd(&r.y);
285
+ }
286
+ secp256k1_scalar_mul(&n, sigr, seckey);
287
+ secp256k1_scalar_add(&n, &n, message);
288
+ secp256k1_scalar_inverse(sigs, nonce);
289
+ secp256k1_scalar_mul(sigs, sigs, &n);
290
+ secp256k1_scalar_clear(&n);
291
+ secp256k1_gej_clear(&rp);
292
+ secp256k1_ge_clear(&r);
293
+ high = secp256k1_scalar_is_high(sigs);
294
+ secp256k1_scalar_cond_negate(sigs, high);
295
+ if (recid) {
296
+ *recid ^= high;
297
+ }
298
+ /* P.x = order is on the curve, so technically sig->r could end up being zero, which would be an invalid signature.
299
+ * This is cryptographically unreachable as hitting it requires finding the discrete log of P.x = N.
300
+ */
301
+ return (int)(!secp256k1_scalar_is_zero(sigr)) & (int)(!secp256k1_scalar_is_zero(sigs));
302
+ }
303
+
304
+ #endif /* SECP256K1_ECDSA_IMPL_H */
@@ -0,0 +1,25 @@
1
+ /***********************************************************************
2
+ * Copyright (c) 2013, 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_ECKEY_H
8
+ #define SECP256K1_ECKEY_H
9
+
10
+ #include <stddef.h>
11
+
12
+ #include "group.h"
13
+ #include "scalar.h"
14
+ #include "ecmult.h"
15
+ #include "ecmult_gen.h"
16
+
17
+ static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size);
18
+ static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed);
19
+
20
+ static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak);
21
+ static int secp256k1_eckey_pubkey_tweak_add(secp256k1_ge *key, const secp256k1_scalar *tweak);
22
+ static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak);
23
+ static int secp256k1_eckey_pubkey_tweak_mul(secp256k1_ge *key, const secp256k1_scalar *tweak);
24
+
25
+ #endif /* SECP256K1_ECKEY_H */
@@ -0,0 +1,92 @@
1
+ /***********************************************************************
2
+ * Copyright (c) 2013, 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_ECKEY_IMPL_H
8
+ #define SECP256K1_ECKEY_IMPL_H
9
+
10
+ #include "eckey.h"
11
+
12
+ #include "scalar.h"
13
+ #include "field.h"
14
+ #include "group.h"
15
+ #include "ecmult_gen.h"
16
+
17
+ static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size) {
18
+ if (size == 33 && (pub[0] == SECP256K1_TAG_PUBKEY_EVEN || pub[0] == SECP256K1_TAG_PUBKEY_ODD)) {
19
+ secp256k1_fe x;
20
+ return secp256k1_fe_set_b32_limit(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == SECP256K1_TAG_PUBKEY_ODD);
21
+ } else if (size == 65 && (pub[0] == SECP256K1_TAG_PUBKEY_UNCOMPRESSED || pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_EVEN || pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_ODD)) {
22
+ secp256k1_fe x, y;
23
+ if (!secp256k1_fe_set_b32_limit(&x, pub+1) || !secp256k1_fe_set_b32_limit(&y, pub+33)) {
24
+ return 0;
25
+ }
26
+ secp256k1_ge_set_xy(elem, &x, &y);
27
+ if ((pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_EVEN || pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_ODD) &&
28
+ secp256k1_fe_is_odd(&y) != (pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_ODD)) {
29
+ return 0;
30
+ }
31
+ return secp256k1_ge_is_valid_var(elem);
32
+ } else {
33
+ return 0;
34
+ }
35
+ }
36
+
37
+ static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed) {
38
+ if (secp256k1_ge_is_infinity(elem)) {
39
+ return 0;
40
+ }
41
+ secp256k1_fe_normalize_var(&elem->x);
42
+ secp256k1_fe_normalize_var(&elem->y);
43
+ secp256k1_fe_get_b32(&pub[1], &elem->x);
44
+ if (compressed) {
45
+ *size = 33;
46
+ pub[0] = secp256k1_fe_is_odd(&elem->y) ? SECP256K1_TAG_PUBKEY_ODD : SECP256K1_TAG_PUBKEY_EVEN;
47
+ } else {
48
+ *size = 65;
49
+ pub[0] = SECP256K1_TAG_PUBKEY_UNCOMPRESSED;
50
+ secp256k1_fe_get_b32(&pub[33], &elem->y);
51
+ }
52
+ return 1;
53
+ }
54
+
55
+ static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak) {
56
+ secp256k1_scalar_add(key, key, tweak);
57
+ return !secp256k1_scalar_is_zero(key);
58
+ }
59
+
60
+ static int secp256k1_eckey_pubkey_tweak_add(secp256k1_ge *key, const secp256k1_scalar *tweak) {
61
+ secp256k1_gej pt;
62
+ secp256k1_gej_set_ge(&pt, key);
63
+ secp256k1_ecmult(&pt, &pt, &secp256k1_scalar_one, tweak);
64
+
65
+ if (secp256k1_gej_is_infinity(&pt)) {
66
+ return 0;
67
+ }
68
+ secp256k1_ge_set_gej(key, &pt);
69
+ return 1;
70
+ }
71
+
72
+ static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak) {
73
+ int ret;
74
+ ret = !secp256k1_scalar_is_zero(tweak);
75
+
76
+ secp256k1_scalar_mul(key, key, tweak);
77
+ return ret;
78
+ }
79
+
80
+ static int secp256k1_eckey_pubkey_tweak_mul(secp256k1_ge *key, const secp256k1_scalar *tweak) {
81
+ secp256k1_gej pt;
82
+ if (secp256k1_scalar_is_zero(tweak)) {
83
+ return 0;
84
+ }
85
+
86
+ secp256k1_gej_set_ge(&pt, key);
87
+ secp256k1_ecmult(&pt, &pt, tweak, &secp256k1_scalar_zero);
88
+ secp256k1_ge_set_gej(key, &pt);
89
+ return 1;
90
+ }
91
+
92
+ #endif /* SECP256K1_ECKEY_IMPL_H */
@@ -0,0 +1,61 @@
1
+ /***********************************************************************
2
+ * Copyright (c) 2013, 2014, 2017 Pieter Wuille, 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_ECMULT_H
8
+ #define SECP256K1_ECMULT_H
9
+
10
+ #include "group.h"
11
+ #include "scalar.h"
12
+ #include "scratch.h"
13
+
14
+ #ifndef ECMULT_WINDOW_SIZE
15
+ # define ECMULT_WINDOW_SIZE 15
16
+ # ifdef DEBUG_CONFIG
17
+ # pragma message DEBUG_CONFIG_MSG("ECMULT_WINDOW_SIZE undefined, assuming default value")
18
+ # endif
19
+ #endif
20
+
21
+ #ifdef DEBUG_CONFIG
22
+ # pragma message DEBUG_CONFIG_DEF(ECMULT_WINDOW_SIZE)
23
+ #endif
24
+
25
+ /* No one will ever need more than a window size of 24. The code might
26
+ * be correct for larger values of ECMULT_WINDOW_SIZE but this is not
27
+ * tested.
28
+ *
29
+ * The following limitations are known, and there are probably more:
30
+ * If WINDOW_G > 27 and size_t has 32 bits, then the code is incorrect
31
+ * because the size of the memory object that we allocate (in bytes)
32
+ * will not fit in a size_t.
33
+ * If WINDOW_G > 31 and int has 32 bits, then the code is incorrect
34
+ * because certain expressions will overflow.
35
+ */
36
+ #if ECMULT_WINDOW_SIZE < 2 || ECMULT_WINDOW_SIZE > 24
37
+ # error Set ECMULT_WINDOW_SIZE to an integer in range [2..24].
38
+ #endif
39
+
40
+ /** The number of entries a table with precomputed multiples needs to have. */
41
+ #define ECMULT_TABLE_SIZE(w) (1L << ((w)-2))
42
+
43
+ /** Double multiply: R = na*A + ng*G */
44
+ static void secp256k1_ecmult(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng);
45
+
46
+ typedef int (secp256k1_ecmult_multi_callback)(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *data);
47
+
48
+ /**
49
+ * Multi-multiply: R = inp_g_sc * G + sum_i ni * Ai.
50
+ * Chooses the right algorithm for a given number of points and scratch space
51
+ * size. Resets and overwrites the given scratch space. If the points do not
52
+ * fit in the scratch space the algorithm is repeatedly run with batches of
53
+ * points. If no scratch space is given then a simple algorithm is used that
54
+ * simply multiplies the points with the corresponding scalars and adds them up.
55
+ * Returns: 1 on success (including when inp_g_sc is NULL and n is 0)
56
+ * 0 if there is not enough scratch space for a single point or
57
+ * callback returns 0
58
+ */
59
+ static int secp256k1_ecmult_multi_var(const secp256k1_callback* error_callback, secp256k1_scratch *scratch, secp256k1_gej *r, const secp256k1_scalar *inp_g_sc, secp256k1_ecmult_multi_callback cb, void *cbdata, size_t n);
60
+
61
+ #endif /* SECP256K1_ECMULT_H */
@@ -0,0 +1,38 @@
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_ECMULT_CONST_H
8
+ #define SECP256K1_ECMULT_CONST_H
9
+
10
+ #include "scalar.h"
11
+ #include "group.h"
12
+
13
+ /**
14
+ * Multiply: R = q*A (in constant-time for q)
15
+ */
16
+ static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q);
17
+
18
+ /**
19
+ * Same as secp256k1_ecmult_const, but takes in an x coordinate of the base point
20
+ * only, specified as fraction n/d (numerator/denominator). Only the x coordinate of the result is
21
+ * returned.
22
+ *
23
+ * If known_on_curve is 0, a verification is performed that n/d is a valid X
24
+ * coordinate, and 0 is returned if not. Otherwise, 1 is returned.
25
+ *
26
+ * d being NULL is interpreted as d=1. If non-NULL, d must not be zero. q must not be zero.
27
+ *
28
+ * Constant time in the value of q, but not any other inputs.
29
+ */
30
+ static int secp256k1_ecmult_const_xonly(
31
+ secp256k1_fe *r,
32
+ const secp256k1_fe *n,
33
+ const secp256k1_fe *d,
34
+ const secp256k1_scalar *q,
35
+ int known_on_curve
36
+ );
37
+
38
+ #endif /* SECP256K1_ECMULT_CONST_H */