@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.
Files changed (183) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +251 -2
  3. package/android/build.gradle +40 -0
  4. package/android/consumer-rules.pro +10 -0
  5. package/android/src/main/AndroidManifest.xml +8 -0
  6. package/android/src/main/java/dev/authon/reactnative/wallet/AuthonWalletModule.kt +235 -0
  7. package/android/src/vendor/GENERATED.md +4 -0
  8. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/AndroidCapabilityProbe.kt +86 -0
  9. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/AuthonWallet.kt +218 -0
  10. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Bitcoin.kt +296 -0
  11. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Bytes.kt +74 -0
  12. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Chains.kt +157 -0
  13. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/CredentialManagerPasskeys.kt +192 -0
  14. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Der.kt +17 -0
  15. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/DeviceStore.kt +170 -0
  16. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/DialogWalletApprover.kt +141 -0
  17. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Eip712.kt +176 -0
  18. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Encodings.kt +133 -0
  19. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/EvmAccount.kt +45 -0
  20. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/EvmTransaction.kt +180 -0
  21. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/GfTables.kt +44 -0
  22. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/HdWallet.kt +130 -0
  23. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Http.kt +86 -0
  24. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/JsValues.kt +83 -0
  25. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/KeystoreDeviceStore.kt +236 -0
  26. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Prf.kt +111 -0
  27. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Proof.kt +134 -0
  28. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Shamir.kt +106 -0
  29. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/SignSummary.kt +335 -0
  30. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Solana.kt +195 -0
  31. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Tron.kt +184 -0
  32. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletApi.kt +361 -0
  33. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletCapabilities.kt +91 -0
  34. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletError.kt +74 -0
  35. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletOps.kt +551 -0
  36. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/WalletTypes.kt +78 -0
  37. package/android/src/vendor/kotlin/dev/authon/sdk/wallet/Xrp.kt +193 -0
  38. package/build/authonContext.d.ts +19 -0
  39. package/build/authonContext.d.ts.map +1 -0
  40. package/build/authonContext.js +20 -0
  41. package/build/authonContext.js.map +1 -0
  42. package/build/client.d.ts +92 -0
  43. package/build/client.d.ts.map +1 -0
  44. package/build/client.js +431 -0
  45. package/build/client.js.map +1 -0
  46. package/build/errors.d.ts +25 -0
  47. package/build/errors.d.ts.map +1 -0
  48. package/build/errors.js +15 -0
  49. package/build/errors.js.map +1 -0
  50. package/build/index.d.ts +7 -0
  51. package/build/index.d.ts.map +1 -0
  52. package/build/index.js +4 -0
  53. package/build/index.js.map +1 -0
  54. package/build/native.d.ts +43 -0
  55. package/build/native.d.ts.map +1 -0
  56. package/build/native.js +12 -0
  57. package/build/native.js.map +1 -0
  58. package/build/types.d.ts +167 -0
  59. package/build/types.d.ts.map +1 -0
  60. package/build/types.js +3 -0
  61. package/build/types.js.map +1 -0
  62. package/build/useAuthonWallet.d.ts +25 -0
  63. package/build/useAuthonWallet.d.ts.map +1 -0
  64. package/build/useAuthonWallet.js +77 -0
  65. package/build/useAuthonWallet.js.map +1 -0
  66. package/expo-module.config.json +9 -0
  67. package/ios/AuthonReactNativeWallet.podspec +41 -0
  68. package/ios/AuthonWalletModule.swift +233 -0
  69. package/ios/vendor/AuthonWallet/AuthonWallet.swift +232 -0
  70. package/ios/vendor/AuthonWallet/Capabilities.swift +149 -0
  71. package/ios/vendor/AuthonWallet/Chains/Bitcoin.swift +296 -0
  72. package/ios/vendor/AuthonWallet/Chains/Solana.swift +207 -0
  73. package/ios/vendor/AuthonWallet/Chains/Tron.swift +181 -0
  74. package/ios/vendor/AuthonWallet/Chains/XRP.swift +191 -0
  75. package/ios/vendor/AuthonWallet/Crypto/BIP39Wordlist.swift +262 -0
  76. package/ios/vendor/AuthonWallet/Crypto/Chains.swift +278 -0
  77. package/ios/vendor/AuthonWallet/Crypto/HDKey.swift +108 -0
  78. package/ios/vendor/AuthonWallet/Crypto/Secp256k1.swift +128 -0
  79. package/ios/vendor/AuthonWallet/Crypto/Shamir.swift +123 -0
  80. package/ios/vendor/AuthonWallet/EVM/Address.swift +57 -0
  81. package/ios/vendor/AuthonWallet/EVM/EvmAccount.swift +48 -0
  82. package/ios/vendor/AuthonWallet/EVM/Transaction.swift +165 -0
  83. package/ios/vendor/AuthonWallet/EVM/TypedData.swift +193 -0
  84. package/ios/vendor/AuthonWallet/Support/BigInteger.swift +220 -0
  85. package/ios/vendor/AuthonWallet/Support/Bytes.swift +89 -0
  86. package/ios/vendor/AuthonWallet/Support/JSONValue.swift +341 -0
  87. package/ios/vendor/AuthonWallet/UI/WalletApprover.swift +250 -0
  88. package/ios/vendor/AuthonWallet/Wallet/Backup.swift +69 -0
  89. package/ios/vendor/AuthonWallet/Wallet/DeviceStore.swift +351 -0
  90. package/ios/vendor/AuthonWallet/Wallet/Passkeys.swift +190 -0
  91. package/ios/vendor/AuthonWallet/Wallet/Proof.swift +143 -0
  92. package/ios/vendor/AuthonWallet/Wallet/Shares.swift +116 -0
  93. package/ios/vendor/AuthonWallet/Wallet/Summary.swift +342 -0
  94. package/ios/vendor/AuthonWallet/Wallet/WalletAPI.swift +361 -0
  95. package/ios/vendor/AuthonWallet/Wallet/WalletOps.swift +654 -0
  96. package/ios/vendor/AuthonWallet/WalletError.swift +84 -0
  97. package/ios/vendor/CKeccak/LICENSE +22 -0
  98. package/ios/vendor/CKeccak/README.md +30 -0
  99. package/ios/vendor/CKeccak/byte_order.h +59 -0
  100. package/ios/vendor/CKeccak/include/ckeccak.h +13 -0
  101. package/ios/vendor/CKeccak/memzero.c +75 -0
  102. package/ios/vendor/CKeccak/memzero.h +8 -0
  103. package/ios/vendor/CKeccak/options.h +99 -0
  104. package/ios/vendor/CKeccak/ripemd160.c +343 -0
  105. package/ios/vendor/CKeccak/ripemd160.h +22 -0
  106. package/ios/vendor/CKeccak/sha3.c +413 -0
  107. package/ios/vendor/CKeccak/sha3.h +89 -0
  108. package/ios/vendor/CMonocypher/LICENCE.md +173 -0
  109. package/ios/vendor/CMonocypher/README.md +27 -0
  110. package/ios/vendor/CMonocypher/include/monocypher-ed25519.h +140 -0
  111. package/ios/vendor/CMonocypher/include/monocypher.h +321 -0
  112. package/ios/vendor/CMonocypher/monocypher-ed25519.c +500 -0
  113. package/ios/vendor/CMonocypher/monocypher.c +2956 -0
  114. package/ios/vendor/CSecp256k1/COPYING +19 -0
  115. package/ios/vendor/CSecp256k1/README.md +35 -0
  116. package/ios/vendor/CSecp256k1/build/precomputed_ecmult.c +3 -0
  117. package/ios/vendor/CSecp256k1/build/precomputed_ecmult_gen.c +3 -0
  118. package/ios/vendor/CSecp256k1/build/secp256k1.c +3 -0
  119. package/ios/vendor/CSecp256k1/include/secp256k1.h +899 -0
  120. package/ios/vendor/CSecp256k1/include/secp256k1_preallocated.h +134 -0
  121. package/ios/vendor/CSecp256k1/include/secp256k1_recovery.h +113 -0
  122. package/ios/vendor/CSecp256k1/src/assumptions.h +87 -0
  123. package/ios/vendor/CSecp256k1/src/checkmem.h +102 -0
  124. package/ios/vendor/CSecp256k1/src/ecdsa.h +21 -0
  125. package/ios/vendor/CSecp256k1/src/ecdsa_impl.h +304 -0
  126. package/ios/vendor/CSecp256k1/src/eckey.h +25 -0
  127. package/ios/vendor/CSecp256k1/src/eckey_impl.h +92 -0
  128. package/ios/vendor/CSecp256k1/src/ecmult.h +61 -0
  129. package/ios/vendor/CSecp256k1/src/ecmult_const.h +38 -0
  130. package/ios/vendor/CSecp256k1/src/ecmult_const_impl.h +399 -0
  131. package/ios/vendor/CSecp256k1/src/ecmult_gen.h +143 -0
  132. package/ios/vendor/CSecp256k1/src/ecmult_gen_impl.h +341 -0
  133. package/ios/vendor/CSecp256k1/src/ecmult_impl.h +853 -0
  134. package/ios/vendor/CSecp256k1/src/field.h +350 -0
  135. package/ios/vendor/CSecp256k1/src/field_10x26.h +57 -0
  136. package/ios/vendor/CSecp256k1/src/field_10x26_impl.h +1232 -0
  137. package/ios/vendor/CSecp256k1/src/field_5x52.h +62 -0
  138. package/ios/vendor/CSecp256k1/src/field_5x52_impl.h +522 -0
  139. package/ios/vendor/CSecp256k1/src/field_5x52_int128_impl.h +274 -0
  140. package/ios/vendor/CSecp256k1/src/field_impl.h +457 -0
  141. package/ios/vendor/CSecp256k1/src/group.h +212 -0
  142. package/ios/vendor/CSecp256k1/src/group_impl.h +974 -0
  143. package/ios/vendor/CSecp256k1/src/hash.h +44 -0
  144. package/ios/vendor/CSecp256k1/src/hash_impl.h +299 -0
  145. package/ios/vendor/CSecp256k1/src/hsort.h +33 -0
  146. package/ios/vendor/CSecp256k1/src/hsort_impl.h +125 -0
  147. package/ios/vendor/CSecp256k1/src/int128.h +90 -0
  148. package/ios/vendor/CSecp256k1/src/int128_impl.h +18 -0
  149. package/ios/vendor/CSecp256k1/src/int128_native.h +19 -0
  150. package/ios/vendor/CSecp256k1/src/int128_native_impl.h +94 -0
  151. package/ios/vendor/CSecp256k1/src/int128_struct.h +14 -0
  152. package/ios/vendor/CSecp256k1/src/int128_struct_impl.h +205 -0
  153. package/ios/vendor/CSecp256k1/src/modinv32.h +43 -0
  154. package/ios/vendor/CSecp256k1/src/modinv32_impl.h +725 -0
  155. package/ios/vendor/CSecp256k1/src/modinv64.h +47 -0
  156. package/ios/vendor/CSecp256k1/src/modinv64_impl.h +780 -0
  157. package/ios/vendor/CSecp256k1/src/modules/recovery/main_impl.h +159 -0
  158. package/ios/vendor/CSecp256k1/src/precomputed_ecmult.c +16456 -0
  159. package/ios/vendor/CSecp256k1/src/precomputed_ecmult.h +38 -0
  160. package/ios/vendor/CSecp256k1/src/precomputed_ecmult_gen.c +1779 -0
  161. package/ios/vendor/CSecp256k1/src/precomputed_ecmult_gen.h +26 -0
  162. package/ios/vendor/CSecp256k1/src/scalar.h +105 -0
  163. package/ios/vendor/CSecp256k1/src/scalar_4x64.h +19 -0
  164. package/ios/vendor/CSecp256k1/src/scalar_4x64_impl.h +1000 -0
  165. package/ios/vendor/CSecp256k1/src/scalar_8x32.h +19 -0
  166. package/ios/vendor/CSecp256k1/src/scalar_8x32_impl.h +816 -0
  167. package/ios/vendor/CSecp256k1/src/scalar_impl.h +321 -0
  168. package/ios/vendor/CSecp256k1/src/scalar_low.h +24 -0
  169. package/ios/vendor/CSecp256k1/src/scalar_low_impl.h +206 -0
  170. package/ios/vendor/CSecp256k1/src/scratch.h +44 -0
  171. package/ios/vendor/CSecp256k1/src/scratch_impl.h +99 -0
  172. package/ios/vendor/CSecp256k1/src/secp256k1.c +831 -0
  173. package/ios/vendor/CSecp256k1/src/selftest.h +32 -0
  174. package/ios/vendor/CSecp256k1/src/util.h +451 -0
  175. package/ios/vendor/GENERATED.md +4 -0
  176. package/package.json +66 -3
  177. package/src/authonContext.ts +30 -0
  178. package/src/client.ts +459 -0
  179. package/src/errors.ts +58 -0
  180. package/src/index.ts +26 -0
  181. package/src/native.ts +52 -0
  182. package/src/types.ts +171 -0
  183. package/src/useAuthonWallet.ts +103 -0
@@ -0,0 +1,44 @@
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_HASH_H
8
+ #define SECP256K1_HASH_H
9
+
10
+ #include <stdlib.h>
11
+ #include <stdint.h>
12
+
13
+ typedef struct {
14
+ uint32_t s[8];
15
+ unsigned char buf[64];
16
+ uint64_t bytes;
17
+ } secp256k1_sha256;
18
+
19
+ static void secp256k1_sha256_initialize(secp256k1_sha256 *hash);
20
+ static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t size);
21
+ static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32);
22
+ static void secp256k1_sha256_clear(secp256k1_sha256 *hash);
23
+
24
+ typedef struct {
25
+ secp256k1_sha256 inner, outer;
26
+ } secp256k1_hmac_sha256;
27
+
28
+ static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t size);
29
+ static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size);
30
+ static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32);
31
+ static void secp256k1_hmac_sha256_clear(secp256k1_hmac_sha256 *hash);
32
+
33
+ typedef struct {
34
+ unsigned char v[32];
35
+ unsigned char k[32];
36
+ int retry;
37
+ } secp256k1_rfc6979_hmac_sha256;
38
+
39
+ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen);
40
+ static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen);
41
+ static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng);
42
+ static void secp256k1_rfc6979_hmac_sha256_clear(secp256k1_rfc6979_hmac_sha256 *rng);
43
+
44
+ #endif /* SECP256K1_HASH_H */
@@ -0,0 +1,299 @@
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_HASH_IMPL_H
8
+ #define SECP256K1_HASH_IMPL_H
9
+
10
+ #include "hash.h"
11
+ #include "util.h"
12
+
13
+ #include <stdlib.h>
14
+ #include <stdint.h>
15
+ #include <string.h>
16
+
17
+ #define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
18
+ #define Maj(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
19
+ #define Sigma0(x) (((x) >> 2 | (x) << 30) ^ ((x) >> 13 | (x) << 19) ^ ((x) >> 22 | (x) << 10))
20
+ #define Sigma1(x) (((x) >> 6 | (x) << 26) ^ ((x) >> 11 | (x) << 21) ^ ((x) >> 25 | (x) << 7))
21
+ #define sigma0(x) (((x) >> 7 | (x) << 25) ^ ((x) >> 18 | (x) << 14) ^ ((x) >> 3))
22
+ #define sigma1(x) (((x) >> 17 | (x) << 15) ^ ((x) >> 19 | (x) << 13) ^ ((x) >> 10))
23
+
24
+ #define Round(a,b,c,d,e,f,g,h,k,w) do { \
25
+ uint32_t t1 = (h) + Sigma1(e) + Ch((e), (f), (g)) + (k) + (w); \
26
+ uint32_t t2 = Sigma0(a) + Maj((a), (b), (c)); \
27
+ (d) += t1; \
28
+ (h) = t1 + t2; \
29
+ } while(0)
30
+
31
+ static void secp256k1_sha256_initialize(secp256k1_sha256 *hash) {
32
+ hash->s[0] = 0x6a09e667ul;
33
+ hash->s[1] = 0xbb67ae85ul;
34
+ hash->s[2] = 0x3c6ef372ul;
35
+ hash->s[3] = 0xa54ff53aul;
36
+ hash->s[4] = 0x510e527ful;
37
+ hash->s[5] = 0x9b05688cul;
38
+ hash->s[6] = 0x1f83d9abul;
39
+ hash->s[7] = 0x5be0cd19ul;
40
+ hash->bytes = 0;
41
+ }
42
+
43
+ /** Perform one SHA-256 transformation, processing 16 big endian 32-bit words. */
44
+ static void secp256k1_sha256_transform(uint32_t* s, const unsigned char* buf) {
45
+ uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7];
46
+ uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
47
+
48
+ Round(a, b, c, d, e, f, g, h, 0x428a2f98, w0 = secp256k1_read_be32(&buf[0]));
49
+ Round(h, a, b, c, d, e, f, g, 0x71374491, w1 = secp256k1_read_be32(&buf[4]));
50
+ Round(g, h, a, b, c, d, e, f, 0xb5c0fbcf, w2 = secp256k1_read_be32(&buf[8]));
51
+ Round(f, g, h, a, b, c, d, e, 0xe9b5dba5, w3 = secp256k1_read_be32(&buf[12]));
52
+ Round(e, f, g, h, a, b, c, d, 0x3956c25b, w4 = secp256k1_read_be32(&buf[16]));
53
+ Round(d, e, f, g, h, a, b, c, 0x59f111f1, w5 = secp256k1_read_be32(&buf[20]));
54
+ Round(c, d, e, f, g, h, a, b, 0x923f82a4, w6 = secp256k1_read_be32(&buf[24]));
55
+ Round(b, c, d, e, f, g, h, a, 0xab1c5ed5, w7 = secp256k1_read_be32(&buf[28]));
56
+ Round(a, b, c, d, e, f, g, h, 0xd807aa98, w8 = secp256k1_read_be32(&buf[32]));
57
+ Round(h, a, b, c, d, e, f, g, 0x12835b01, w9 = secp256k1_read_be32(&buf[36]));
58
+ Round(g, h, a, b, c, d, e, f, 0x243185be, w10 = secp256k1_read_be32(&buf[40]));
59
+ Round(f, g, h, a, b, c, d, e, 0x550c7dc3, w11 = secp256k1_read_be32(&buf[44]));
60
+ Round(e, f, g, h, a, b, c, d, 0x72be5d74, w12 = secp256k1_read_be32(&buf[48]));
61
+ Round(d, e, f, g, h, a, b, c, 0x80deb1fe, w13 = secp256k1_read_be32(&buf[52]));
62
+ Round(c, d, e, f, g, h, a, b, 0x9bdc06a7, w14 = secp256k1_read_be32(&buf[56]));
63
+ Round(b, c, d, e, f, g, h, a, 0xc19bf174, w15 = secp256k1_read_be32(&buf[60]));
64
+
65
+ Round(a, b, c, d, e, f, g, h, 0xe49b69c1, w0 += sigma1(w14) + w9 + sigma0(w1));
66
+ Round(h, a, b, c, d, e, f, g, 0xefbe4786, w1 += sigma1(w15) + w10 + sigma0(w2));
67
+ Round(g, h, a, b, c, d, e, f, 0x0fc19dc6, w2 += sigma1(w0) + w11 + sigma0(w3));
68
+ Round(f, g, h, a, b, c, d, e, 0x240ca1cc, w3 += sigma1(w1) + w12 + sigma0(w4));
69
+ Round(e, f, g, h, a, b, c, d, 0x2de92c6f, w4 += sigma1(w2) + w13 + sigma0(w5));
70
+ Round(d, e, f, g, h, a, b, c, 0x4a7484aa, w5 += sigma1(w3) + w14 + sigma0(w6));
71
+ Round(c, d, e, f, g, h, a, b, 0x5cb0a9dc, w6 += sigma1(w4) + w15 + sigma0(w7));
72
+ Round(b, c, d, e, f, g, h, a, 0x76f988da, w7 += sigma1(w5) + w0 + sigma0(w8));
73
+ Round(a, b, c, d, e, f, g, h, 0x983e5152, w8 += sigma1(w6) + w1 + sigma0(w9));
74
+ Round(h, a, b, c, d, e, f, g, 0xa831c66d, w9 += sigma1(w7) + w2 + sigma0(w10));
75
+ Round(g, h, a, b, c, d, e, f, 0xb00327c8, w10 += sigma1(w8) + w3 + sigma0(w11));
76
+ Round(f, g, h, a, b, c, d, e, 0xbf597fc7, w11 += sigma1(w9) + w4 + sigma0(w12));
77
+ Round(e, f, g, h, a, b, c, d, 0xc6e00bf3, w12 += sigma1(w10) + w5 + sigma0(w13));
78
+ Round(d, e, f, g, h, a, b, c, 0xd5a79147, w13 += sigma1(w11) + w6 + sigma0(w14));
79
+ Round(c, d, e, f, g, h, a, b, 0x06ca6351, w14 += sigma1(w12) + w7 + sigma0(w15));
80
+ Round(b, c, d, e, f, g, h, a, 0x14292967, w15 += sigma1(w13) + w8 + sigma0(w0));
81
+
82
+ Round(a, b, c, d, e, f, g, h, 0x27b70a85, w0 += sigma1(w14) + w9 + sigma0(w1));
83
+ Round(h, a, b, c, d, e, f, g, 0x2e1b2138, w1 += sigma1(w15) + w10 + sigma0(w2));
84
+ Round(g, h, a, b, c, d, e, f, 0x4d2c6dfc, w2 += sigma1(w0) + w11 + sigma0(w3));
85
+ Round(f, g, h, a, b, c, d, e, 0x53380d13, w3 += sigma1(w1) + w12 + sigma0(w4));
86
+ Round(e, f, g, h, a, b, c, d, 0x650a7354, w4 += sigma1(w2) + w13 + sigma0(w5));
87
+ Round(d, e, f, g, h, a, b, c, 0x766a0abb, w5 += sigma1(w3) + w14 + sigma0(w6));
88
+ Round(c, d, e, f, g, h, a, b, 0x81c2c92e, w6 += sigma1(w4) + w15 + sigma0(w7));
89
+ Round(b, c, d, e, f, g, h, a, 0x92722c85, w7 += sigma1(w5) + w0 + sigma0(w8));
90
+ Round(a, b, c, d, e, f, g, h, 0xa2bfe8a1, w8 += sigma1(w6) + w1 + sigma0(w9));
91
+ Round(h, a, b, c, d, e, f, g, 0xa81a664b, w9 += sigma1(w7) + w2 + sigma0(w10));
92
+ Round(g, h, a, b, c, d, e, f, 0xc24b8b70, w10 += sigma1(w8) + w3 + sigma0(w11));
93
+ Round(f, g, h, a, b, c, d, e, 0xc76c51a3, w11 += sigma1(w9) + w4 + sigma0(w12));
94
+ Round(e, f, g, h, a, b, c, d, 0xd192e819, w12 += sigma1(w10) + w5 + sigma0(w13));
95
+ Round(d, e, f, g, h, a, b, c, 0xd6990624, w13 += sigma1(w11) + w6 + sigma0(w14));
96
+ Round(c, d, e, f, g, h, a, b, 0xf40e3585, w14 += sigma1(w12) + w7 + sigma0(w15));
97
+ Round(b, c, d, e, f, g, h, a, 0x106aa070, w15 += sigma1(w13) + w8 + sigma0(w0));
98
+
99
+ Round(a, b, c, d, e, f, g, h, 0x19a4c116, w0 += sigma1(w14) + w9 + sigma0(w1));
100
+ Round(h, a, b, c, d, e, f, g, 0x1e376c08, w1 += sigma1(w15) + w10 + sigma0(w2));
101
+ Round(g, h, a, b, c, d, e, f, 0x2748774c, w2 += sigma1(w0) + w11 + sigma0(w3));
102
+ Round(f, g, h, a, b, c, d, e, 0x34b0bcb5, w3 += sigma1(w1) + w12 + sigma0(w4));
103
+ Round(e, f, g, h, a, b, c, d, 0x391c0cb3, w4 += sigma1(w2) + w13 + sigma0(w5));
104
+ Round(d, e, f, g, h, a, b, c, 0x4ed8aa4a, w5 += sigma1(w3) + w14 + sigma0(w6));
105
+ Round(c, d, e, f, g, h, a, b, 0x5b9cca4f, w6 += sigma1(w4) + w15 + sigma0(w7));
106
+ Round(b, c, d, e, f, g, h, a, 0x682e6ff3, w7 += sigma1(w5) + w0 + sigma0(w8));
107
+ Round(a, b, c, d, e, f, g, h, 0x748f82ee, w8 += sigma1(w6) + w1 + sigma0(w9));
108
+ Round(h, a, b, c, d, e, f, g, 0x78a5636f, w9 += sigma1(w7) + w2 + sigma0(w10));
109
+ Round(g, h, a, b, c, d, e, f, 0x84c87814, w10 += sigma1(w8) + w3 + sigma0(w11));
110
+ Round(f, g, h, a, b, c, d, e, 0x8cc70208, w11 += sigma1(w9) + w4 + sigma0(w12));
111
+ Round(e, f, g, h, a, b, c, d, 0x90befffa, w12 += sigma1(w10) + w5 + sigma0(w13));
112
+ Round(d, e, f, g, h, a, b, c, 0xa4506ceb, w13 += sigma1(w11) + w6 + sigma0(w14));
113
+ Round(c, d, e, f, g, h, a, b, 0xbef9a3f7, w14 + sigma1(w12) + w7 + sigma0(w15));
114
+ Round(b, c, d, e, f, g, h, a, 0xc67178f2, w15 + sigma1(w13) + w8 + sigma0(w0));
115
+
116
+ s[0] += a;
117
+ s[1] += b;
118
+ s[2] += c;
119
+ s[3] += d;
120
+ s[4] += e;
121
+ s[5] += f;
122
+ s[6] += g;
123
+ s[7] += h;
124
+ }
125
+
126
+ static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t len) {
127
+ size_t bufsize = hash->bytes & 0x3F;
128
+ hash->bytes += len;
129
+ VERIFY_CHECK(hash->bytes >= len);
130
+ while (len >= 64 - bufsize) {
131
+ /* Fill the buffer, and process it. */
132
+ size_t chunk_len = 64 - bufsize;
133
+ memcpy(hash->buf + bufsize, data, chunk_len);
134
+ data += chunk_len;
135
+ len -= chunk_len;
136
+ secp256k1_sha256_transform(hash->s, hash->buf);
137
+ bufsize = 0;
138
+ }
139
+ if (len) {
140
+ /* Fill the buffer with what remains. */
141
+ memcpy(hash->buf + bufsize, data, len);
142
+ }
143
+ }
144
+
145
+ static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32) {
146
+ static const unsigned char pad[64] = {0x80};
147
+ unsigned char sizedesc[8];
148
+ int i;
149
+ /* The maximum message size of SHA256 is 2^64-1 bits. */
150
+ VERIFY_CHECK(hash->bytes < ((uint64_t)1 << 61));
151
+ secp256k1_write_be32(&sizedesc[0], hash->bytes >> 29);
152
+ secp256k1_write_be32(&sizedesc[4], hash->bytes << 3);
153
+ secp256k1_sha256_write(hash, pad, 1 + ((119 - (hash->bytes % 64)) % 64));
154
+ secp256k1_sha256_write(hash, sizedesc, 8);
155
+ for (i = 0; i < 8; i++) {
156
+ secp256k1_write_be32(&out32[4*i], hash->s[i]);
157
+ hash->s[i] = 0;
158
+ }
159
+ }
160
+
161
+ /* Initializes a sha256 struct and writes the 64 byte string
162
+ * SHA256(tag)||SHA256(tag) into it. */
163
+ static void secp256k1_sha256_initialize_tagged(secp256k1_sha256 *hash, const unsigned char *tag, size_t taglen) {
164
+ unsigned char buf[32];
165
+ secp256k1_sha256_initialize(hash);
166
+ secp256k1_sha256_write(hash, tag, taglen);
167
+ secp256k1_sha256_finalize(hash, buf);
168
+
169
+ secp256k1_sha256_initialize(hash);
170
+ secp256k1_sha256_write(hash, buf, 32);
171
+ secp256k1_sha256_write(hash, buf, 32);
172
+ }
173
+
174
+ static void secp256k1_sha256_clear(secp256k1_sha256 *hash) {
175
+ secp256k1_memclear(hash, sizeof(*hash));
176
+ }
177
+
178
+ static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t keylen) {
179
+ size_t n;
180
+ unsigned char rkey[64];
181
+ if (keylen <= sizeof(rkey)) {
182
+ memcpy(rkey, key, keylen);
183
+ memset(rkey + keylen, 0, sizeof(rkey) - keylen);
184
+ } else {
185
+ secp256k1_sha256 sha256;
186
+ secp256k1_sha256_initialize(&sha256);
187
+ secp256k1_sha256_write(&sha256, key, keylen);
188
+ secp256k1_sha256_finalize(&sha256, rkey);
189
+ memset(rkey + 32, 0, 32);
190
+ }
191
+
192
+ secp256k1_sha256_initialize(&hash->outer);
193
+ for (n = 0; n < sizeof(rkey); n++) {
194
+ rkey[n] ^= 0x5c;
195
+ }
196
+ secp256k1_sha256_write(&hash->outer, rkey, sizeof(rkey));
197
+
198
+ secp256k1_sha256_initialize(&hash->inner);
199
+ for (n = 0; n < sizeof(rkey); n++) {
200
+ rkey[n] ^= 0x5c ^ 0x36;
201
+ }
202
+ secp256k1_sha256_write(&hash->inner, rkey, sizeof(rkey));
203
+ secp256k1_memclear(rkey, sizeof(rkey));
204
+ }
205
+
206
+ static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size) {
207
+ secp256k1_sha256_write(&hash->inner, data, size);
208
+ }
209
+
210
+ static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32) {
211
+ unsigned char temp[32];
212
+ secp256k1_sha256_finalize(&hash->inner, temp);
213
+ secp256k1_sha256_write(&hash->outer, temp, 32);
214
+ secp256k1_memclear(temp, sizeof(temp));
215
+ secp256k1_sha256_finalize(&hash->outer, out32);
216
+ }
217
+
218
+ static void secp256k1_hmac_sha256_clear(secp256k1_hmac_sha256 *hash) {
219
+ secp256k1_memclear(hash, sizeof(*hash));
220
+ }
221
+
222
+ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen) {
223
+ secp256k1_hmac_sha256 hmac;
224
+ static const unsigned char zero[1] = {0x00};
225
+ static const unsigned char one[1] = {0x01};
226
+
227
+ memset(rng->v, 0x01, 32); /* RFC6979 3.2.b. */
228
+ memset(rng->k, 0x00, 32); /* RFC6979 3.2.c. */
229
+
230
+ /* RFC6979 3.2.d. */
231
+ secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
232
+ secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
233
+ secp256k1_hmac_sha256_write(&hmac, zero, 1);
234
+ secp256k1_hmac_sha256_write(&hmac, key, keylen);
235
+ secp256k1_hmac_sha256_finalize(&hmac, rng->k);
236
+ secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
237
+ secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
238
+ secp256k1_hmac_sha256_finalize(&hmac, rng->v);
239
+
240
+ /* RFC6979 3.2.f. */
241
+ secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
242
+ secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
243
+ secp256k1_hmac_sha256_write(&hmac, one, 1);
244
+ secp256k1_hmac_sha256_write(&hmac, key, keylen);
245
+ secp256k1_hmac_sha256_finalize(&hmac, rng->k);
246
+ secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
247
+ secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
248
+ secp256k1_hmac_sha256_finalize(&hmac, rng->v);
249
+ rng->retry = 0;
250
+ }
251
+
252
+ static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen) {
253
+ /* RFC6979 3.2.h. */
254
+ static const unsigned char zero[1] = {0x00};
255
+ if (rng->retry) {
256
+ secp256k1_hmac_sha256 hmac;
257
+ secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
258
+ secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
259
+ secp256k1_hmac_sha256_write(&hmac, zero, 1);
260
+ secp256k1_hmac_sha256_finalize(&hmac, rng->k);
261
+ secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
262
+ secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
263
+ secp256k1_hmac_sha256_finalize(&hmac, rng->v);
264
+ }
265
+
266
+ while (outlen > 0) {
267
+ secp256k1_hmac_sha256 hmac;
268
+ int now = outlen;
269
+ secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
270
+ secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
271
+ secp256k1_hmac_sha256_finalize(&hmac, rng->v);
272
+ if (now > 32) {
273
+ now = 32;
274
+ }
275
+ memcpy(out, rng->v, now);
276
+ out += now;
277
+ outlen -= now;
278
+ }
279
+
280
+ rng->retry = 1;
281
+ }
282
+
283
+ static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng) {
284
+ (void) rng;
285
+ }
286
+
287
+ static void secp256k1_rfc6979_hmac_sha256_clear(secp256k1_rfc6979_hmac_sha256 *rng) {
288
+ secp256k1_memclear(rng, sizeof(*rng));
289
+ }
290
+
291
+ #undef Round
292
+ #undef sigma1
293
+ #undef sigma0
294
+ #undef Sigma1
295
+ #undef Sigma0
296
+ #undef Maj
297
+ #undef Ch
298
+
299
+ #endif /* SECP256K1_HASH_IMPL_H */
@@ -0,0 +1,33 @@
1
+ /***********************************************************************
2
+ * Copyright (c) 2021 Russell O'Connor, Jonas Nick *
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_HSORT_H
8
+ #define SECP256K1_HSORT_H
9
+
10
+ #include <stddef.h>
11
+ #include <string.h>
12
+
13
+ /* In-place, iterative heapsort with an interface matching glibc's qsort_r. This
14
+ * is preferred over standard library implementations because they generally
15
+ * make no guarantee about being fast for malicious inputs.
16
+ * Remember that heapsort is unstable.
17
+ *
18
+ * In/Out: ptr: pointer to the array to sort. The contents of the array are
19
+ * sorted in ascending order according to the comparison function.
20
+ * In: count: number of elements in the array.
21
+ * size: size in bytes of each element.
22
+ * cmp: pointer to a comparison function that is called with two
23
+ * arguments that point to the objects being compared. The cmp_data
24
+ * argument of secp256k1_hsort is passed as third argument. The
25
+ * function must return an integer less than, equal to, or greater
26
+ * than zero if the first argument is considered to be respectively
27
+ * less than, equal to, or greater than the second.
28
+ * cmp_data: pointer passed as third argument to cmp.
29
+ */
30
+ static void secp256k1_hsort(void *ptr, size_t count, size_t size,
31
+ int (*cmp)(const void *, const void *, void *),
32
+ void *cmp_data);
33
+ #endif
@@ -0,0 +1,125 @@
1
+ /***********************************************************************
2
+ * Copyright (c) 2021 Russell O'Connor, Jonas Nick *
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_HSORT_IMPL_H
8
+ #define SECP256K1_HSORT_IMPL_H
9
+
10
+ #include "hsort.h"
11
+
12
+ /* An array is a heap when, for all non-zero indexes i, the element at index i
13
+ * compares as less than or equal to the element at index parent(i) = (i-1)/2.
14
+ */
15
+
16
+ static SECP256K1_INLINE size_t secp256k1_heap_child1(size_t i) {
17
+ VERIFY_CHECK(i <= (SIZE_MAX - 1)/2);
18
+ return 2*i + 1;
19
+ }
20
+
21
+ static SECP256K1_INLINE size_t secp256k1_heap_child2(size_t i) {
22
+ VERIFY_CHECK(i <= SIZE_MAX/2 - 1);
23
+ return secp256k1_heap_child1(i)+1;
24
+ }
25
+
26
+ static SECP256K1_INLINE void secp256k1_heap_swap64(unsigned char *a, unsigned char *b, size_t len) {
27
+ unsigned char tmp[64];
28
+ VERIFY_CHECK(len <= 64);
29
+ memcpy(tmp, a, len);
30
+ memmove(a, b, len);
31
+ memcpy(b, tmp, len);
32
+ }
33
+
34
+ static SECP256K1_INLINE void secp256k1_heap_swap(unsigned char *arr, size_t i, size_t j, size_t stride) {
35
+ unsigned char *a = arr + i*stride;
36
+ unsigned char *b = arr + j*stride;
37
+ size_t len = stride;
38
+ while (64 < len) {
39
+ secp256k1_heap_swap64(a + (len - 64), b + (len - 64), 64);
40
+ len -= 64;
41
+ }
42
+ secp256k1_heap_swap64(a, b, len);
43
+ }
44
+
45
+ /* This function accepts an array arr containing heap_size elements, each of
46
+ * size stride. The elements in the array at indices >i satisfy the max-heap
47
+ * property, i.e., for any element at index j (where j > i), all of its children
48
+ * are smaller than the element itself. The purpose of the function is to update
49
+ * the array so that all elements at indices >=i satisfy the max-heap
50
+ * property. */
51
+ static SECP256K1_INLINE void secp256k1_heap_down(unsigned char *arr, size_t i, size_t heap_size, size_t stride,
52
+ int (*cmp)(const void *, const void *, void *), void *cmp_data) {
53
+ while (i < heap_size/2) {
54
+ VERIFY_CHECK(i <= SIZE_MAX/2 - 1);
55
+ /* Proof:
56
+ * i < heap_size/2
57
+ * i + 1 <= heap_size/2
58
+ * 2*i + 2 <= heap_size <= SIZE_MAX
59
+ * 2*i <= SIZE_MAX - 2
60
+ */
61
+
62
+ VERIFY_CHECK(secp256k1_heap_child1(i) < heap_size);
63
+ /* Proof:
64
+ * i < heap_size/2
65
+ * i + 1 <= heap_size/2
66
+ * 2*i + 2 <= heap_size
67
+ * 2*i + 1 < heap_size
68
+ * child1(i) < heap_size
69
+ */
70
+
71
+ /* Let [x] be notation for the contents at arr[x*stride].
72
+ *
73
+ * If [child1(i)] > [i] and [child2(i)] > [i],
74
+ * swap [i] with the larger child to ensure the new parent is larger
75
+ * than both children. When [child1(i)] == [child2(i)], swap [i] with
76
+ * [child2(i)].
77
+ * Else if [child1(i)] > [i], swap [i] with [child1(i)].
78
+ * Else if [child2(i)] > [i], swap [i] with [child2(i)].
79
+ */
80
+ if (secp256k1_heap_child2(i) < heap_size
81
+ && 0 <= cmp(arr + secp256k1_heap_child2(i)*stride, arr + secp256k1_heap_child1(i)*stride, cmp_data)) {
82
+ if (0 < cmp(arr + secp256k1_heap_child2(i)*stride, arr + i*stride, cmp_data)) {
83
+ secp256k1_heap_swap(arr, i, secp256k1_heap_child2(i), stride);
84
+ i = secp256k1_heap_child2(i);
85
+ } else {
86
+ /* At this point we have [child2(i)] >= [child1(i)] and we have
87
+ * [child2(i)] <= [i], and thus [child1(i)] <= [i] which means
88
+ * that the next comparison can be skipped. */
89
+ return;
90
+ }
91
+ } else if (0 < cmp(arr + secp256k1_heap_child1(i)*stride, arr + i*stride, cmp_data)) {
92
+ secp256k1_heap_swap(arr, i, secp256k1_heap_child1(i), stride);
93
+ i = secp256k1_heap_child1(i);
94
+ } else {
95
+ return;
96
+ }
97
+ }
98
+ /* heap_size/2 <= i
99
+ * heap_size/2 < i + 1
100
+ * heap_size < 2*i + 2
101
+ * heap_size <= 2*i + 1
102
+ * heap_size <= child1(i)
103
+ * Thus child1(i) and child2(i) are now out of bounds and we are at a leaf.
104
+ */
105
+ }
106
+
107
+ /* In-place heap sort. */
108
+ static void secp256k1_hsort(void *ptr, size_t count, size_t size,
109
+ int (*cmp)(const void *, const void *, void *),
110
+ void *cmp_data) {
111
+ size_t i;
112
+
113
+ for (i = count/2; 0 < i; --i) {
114
+ secp256k1_heap_down(ptr, i-1, count, size, cmp, cmp_data);
115
+ }
116
+ for (i = count; 1 < i; --i) {
117
+ /* Extract the largest value from the heap */
118
+ secp256k1_heap_swap(ptr, 0, i-1, size);
119
+
120
+ /* Repair the heap condition */
121
+ secp256k1_heap_down(ptr, 0, i-1, size, cmp, cmp_data);
122
+ }
123
+ }
124
+
125
+ #endif
@@ -0,0 +1,90 @@
1
+ #ifndef SECP256K1_INT128_H
2
+ #define SECP256K1_INT128_H
3
+
4
+ #include "util.h"
5
+
6
+ #if defined(SECP256K1_WIDEMUL_INT128)
7
+ # if defined(SECP256K1_INT128_NATIVE)
8
+ # include "int128_native.h"
9
+ # elif defined(SECP256K1_INT128_STRUCT)
10
+ # include "int128_struct.h"
11
+ # else
12
+ # error "Please select int128 implementation"
13
+ # endif
14
+
15
+ /* Construct an unsigned 128-bit value from a high and a low 64-bit value. */
16
+ static SECP256K1_INLINE void secp256k1_u128_load(secp256k1_uint128 *r, uint64_t hi, uint64_t lo);
17
+
18
+ /* Multiply two unsigned 64-bit values a and b and write the result to r. */
19
+ static SECP256K1_INLINE void secp256k1_u128_mul(secp256k1_uint128 *r, uint64_t a, uint64_t b);
20
+
21
+ /* Multiply two unsigned 64-bit values a and b and add the result to r.
22
+ * The final result is taken modulo 2^128.
23
+ */
24
+ static SECP256K1_INLINE void secp256k1_u128_accum_mul(secp256k1_uint128 *r, uint64_t a, uint64_t b);
25
+
26
+ /* Add an unsigned 64-bit value a to r.
27
+ * The final result is taken modulo 2^128.
28
+ */
29
+ static SECP256K1_INLINE void secp256k1_u128_accum_u64(secp256k1_uint128 *r, uint64_t a);
30
+
31
+ /* Unsigned (logical) right shift.
32
+ * Non-constant time in n.
33
+ */
34
+ static SECP256K1_INLINE void secp256k1_u128_rshift(secp256k1_uint128 *r, unsigned int n);
35
+
36
+ /* Return the low 64-bits of a 128-bit value as an unsigned 64-bit value. */
37
+ static SECP256K1_INLINE uint64_t secp256k1_u128_to_u64(const secp256k1_uint128 *a);
38
+
39
+ /* Return the high 64-bits of a 128-bit value as an unsigned 64-bit value. */
40
+ static SECP256K1_INLINE uint64_t secp256k1_u128_hi_u64(const secp256k1_uint128 *a);
41
+
42
+ /* Write an unsigned 64-bit value to r. */
43
+ static SECP256K1_INLINE void secp256k1_u128_from_u64(secp256k1_uint128 *r, uint64_t a);
44
+
45
+ /* Tests if r is strictly less than to 2^n.
46
+ * n must be strictly less than 128.
47
+ */
48
+ static SECP256K1_INLINE int secp256k1_u128_check_bits(const secp256k1_uint128 *r, unsigned int n);
49
+
50
+ /* Construct an signed 128-bit value from a high and a low 64-bit value. */
51
+ static SECP256K1_INLINE void secp256k1_i128_load(secp256k1_int128 *r, int64_t hi, uint64_t lo);
52
+
53
+ /* Multiply two signed 64-bit values a and b and write the result to r. */
54
+ static SECP256K1_INLINE void secp256k1_i128_mul(secp256k1_int128 *r, int64_t a, int64_t b);
55
+
56
+ /* Multiply two signed 64-bit values a and b and add the result to r.
57
+ * Overflow or underflow from the addition is undefined behaviour.
58
+ */
59
+ static SECP256K1_INLINE void secp256k1_i128_accum_mul(secp256k1_int128 *r, int64_t a, int64_t b);
60
+
61
+ /* Compute a*d - b*c from signed 64-bit values and write the result to r. */
62
+ static SECP256K1_INLINE void secp256k1_i128_det(secp256k1_int128 *r, int64_t a, int64_t b, int64_t c, int64_t d);
63
+
64
+ /* Signed (arithmetic) right shift.
65
+ * Non-constant time in b.
66
+ */
67
+ static SECP256K1_INLINE void secp256k1_i128_rshift(secp256k1_int128 *r, unsigned int b);
68
+
69
+ /* Return the input value modulo 2^64. */
70
+ static SECP256K1_INLINE uint64_t secp256k1_i128_to_u64(const secp256k1_int128 *a);
71
+
72
+ /* Return the value as a signed 64-bit value.
73
+ * Requires the input to be between INT64_MIN and INT64_MAX.
74
+ */
75
+ static SECP256K1_INLINE int64_t secp256k1_i128_to_i64(const secp256k1_int128 *a);
76
+
77
+ /* Write a signed 64-bit value to r. */
78
+ static SECP256K1_INLINE void secp256k1_i128_from_i64(secp256k1_int128 *r, int64_t a);
79
+
80
+ /* Compare two 128-bit values for equality. */
81
+ static SECP256K1_INLINE int secp256k1_i128_eq_var(const secp256k1_int128 *a, const secp256k1_int128 *b);
82
+
83
+ /* Tests if r is equal to sign*2^n (sign must be 1 or -1).
84
+ * n must be strictly less than 127.
85
+ */
86
+ static SECP256K1_INLINE int secp256k1_i128_check_pow2(const secp256k1_int128 *r, unsigned int n, int sign);
87
+
88
+ #endif
89
+
90
+ #endif
@@ -0,0 +1,18 @@
1
+ #ifndef SECP256K1_INT128_IMPL_H
2
+ #define SECP256K1_INT128_IMPL_H
3
+
4
+ #include "util.h"
5
+
6
+ #include "int128.h"
7
+
8
+ #if defined(SECP256K1_WIDEMUL_INT128)
9
+ # if defined(SECP256K1_INT128_NATIVE)
10
+ # include "int128_native_impl.h"
11
+ # elif defined(SECP256K1_INT128_STRUCT)
12
+ # include "int128_struct_impl.h"
13
+ # else
14
+ # error "Please select int128 implementation"
15
+ # endif
16
+ #endif
17
+
18
+ #endif
@@ -0,0 +1,19 @@
1
+ #ifndef SECP256K1_INT128_NATIVE_H
2
+ #define SECP256K1_INT128_NATIVE_H
3
+
4
+ #include <stdint.h>
5
+ #include "util.h"
6
+
7
+ #if !defined(UINT128_MAX) && defined(__SIZEOF_INT128__)
8
+ SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t;
9
+ SECP256K1_GNUC_EXT typedef __int128 int128_t;
10
+ # define UINT128_MAX ((uint128_t)(-1))
11
+ # define INT128_MAX ((int128_t)(UINT128_MAX >> 1))
12
+ # define INT128_MIN (-INT128_MAX - 1)
13
+ /* No (U)INT128_C macros because compilers providing __int128 do not support 128-bit literals. */
14
+ #endif
15
+
16
+ typedef uint128_t secp256k1_uint128;
17
+ typedef int128_t secp256k1_int128;
18
+
19
+ #endif