Dero Web Wallet derosuite. This repo contains changes required for webwallet. With this changes any Dero daemon can become web wallet. All changes are related to daemon rpc server and wallet to make it light and faster.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

251 lines
9.0KB

  1. // Copyright 2017-2018 DERO Project. All rights reserved.
  2. // Use of this source code in any form is governed by RESEARCH license.
  3. // license can be found in the LICENSE file.
  4. // GPG: 0F39 E425 8C65 3947 702A 8234 08B2 0360 A03A 9DE8
  5. //
  6. //
  7. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
  8. // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  9. // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
  10. // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  11. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  12. // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  13. // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  14. // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
  15. // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16. package address
  17. import "fmt"
  18. import "bytes"
  19. import "testing"
  20. import "encoding/hex"
  21. import "github.com/deroproject/derosuite/config"
  22. func TestAddressError(t *testing.T) {
  23. _, err := NewAddress("")
  24. want := fmt.Errorf("Address is not complete")
  25. if err.Error() != want.Error() {
  26. t.Fatalf("want: %s, got: %s", want, err)
  27. }
  28. _, err = NewAddress("dERoNzsi5WW1ABhQ1UGLwoLqBU6sbzvyuS4cCi4PGzW7QRM5TH4MUf3QvZUBNJCYSDPw6K495eroGe24cf75uDdD2QwWy9pchN")
  29. want = fmt.Errorf("Checksum failed")
  30. if err.Error() != want.Error() {
  31. t.Fatalf("want: %s, got: %s", want, err)
  32. }
  33. }
  34. func TestAddress(t *testing.T) {
  35. const Monero_MainNetwork = 18
  36. const Monero_TestNetwork = 53
  37. tests := []struct {
  38. name string
  39. Network uint64
  40. SpendingKeyHex string
  41. ViewingKeyHex string
  42. Address string
  43. }{
  44. {
  45. name: "generic",
  46. Network: Monero_MainNetwork,
  47. SpendingKeyHex: "8c1a9d5ff5aaf1c3cdeb2a1be62f07a34ae6b15fe47a254c8bc240f348271679",
  48. ViewingKeyHex: "0a29b163e392eb9416a52907fd7d3b84530f8d02ff70b1f63e72fdcb54cf7fe1",
  49. Address: "46w3n5EGhBeZkYmKvQRsd8UK9GhvcbYWQDobJape3NLMMFEjFZnJ3CnRmeKspubQGiP8iMTwFEX2QiBsjUkjKT4SSPd3fKp",
  50. },
  51. {
  52. name: "generic 2",
  53. Network: Monero_MainNetwork,
  54. SpendingKeyHex: "5007b84275af9a173c2080683afce90b2157ab640c18ddd5ce3e060a18a9ce99",
  55. ViewingKeyHex: "27024b45150037b677418fcf11ba9675494ffdf994f329b9f7a8f8402b7934a0",
  56. Address: "44f1Y84r9Lu4tQdLWRxV122rygfhUeVBrcmBaqcYCwUHScmf1ht8DFLXX9YN4T7nPPLcpqYLUdrFiY77nQYeH9RuK9gg4p6",
  57. },
  58. {
  59. name: "require 1 padding in middle",
  60. Network: Monero_MainNetwork,
  61. SpendingKeyHex: "6add197bd82866e8bfbf1dc2fdf49873ec5f679059652da549cd806f2b166756",
  62. ViewingKeyHex: "f5cf2897088fda0f7ac1c42491ed7d558a46ee41d0c81d038fd53ff4360afda0",
  63. Address: "45fzHekTd5FfvxWBPYX2TqLPbtWjaofxYUeWCi6BRQXYFYd85sY2qw73bAuKhqY7deFJr6pN3STY81bZ9x2Zf4nGKASksqe",
  64. },
  65. {
  66. name: "require 1 padding in last chunk",
  67. Network: Monero_MainNetwork,
  68. SpendingKeyHex: "50defe92d88b19aaf6bf66f061dd4380b79866a4122b25a03bceb571767dbe7b",
  69. ViewingKeyHex: "f8f6f28283921bf5a17f0bcf4306233fc25ce9b6276154ad0de22aebc5c67702",
  70. Address: "44grjkXtDHJVbZgtU1UKnrNXidcHfZ3HWToU5WjR3KgHMjgwrYLjXC6i5vm3HCp4vnBfYaNEyNiuZVwqtHD2SenS1JBRyco",
  71. },
  72. {
  73. name: "testnet",
  74. Network: Monero_TestNetwork,
  75. SpendingKeyHex: "8de9cce254e60cd940abf6c77ef344c3a21fad74320e45734fbfcd5870e5c875",
  76. ViewingKeyHex: "27024b45150037b677418fcf11ba9675494ffdf994f329b9f7a8f8402b7934a0",
  77. Address: "9xYZvCDf6aFdLd7Qawg5XHZitWLKoeFvcLHfe5GxsGCFLbXSWeQNKciXX9YN4T7nPPLcpqYLUdrFiY77nQYeH9RuK9bogZJ",
  78. },
  79. {
  80. name: "DERO testnet",
  81. Network: config.Testnet.Public_Address_Prefix,
  82. SpendingKeyHex: "ffb4baf32792d38d36c5f1792201d1cff142a10bad6aa088090156a35858739d",
  83. ViewingKeyHex: "0ea428a9608fc9dc06acceea608ac97cc9119647b943941a381306548ee43455",
  84. Address: "dETosYceeTxRZQBk5hQzN51JepzZn5H24JqR96q7mY7ZFo6JhJKPNSKR3vs9ES1ibyQDQgeRheDP6CJbb7AKJY2H9eacz2RtPy",
  85. },
  86. {
  87. name: "DERO mainnet requires padding in second block",
  88. Network: config.Mainnet.Public_Address_Prefix,
  89. SpendingKeyHex: "10a80329a700f25c9892a696de768f5bdc73cafe6095d647e5707c04f48c0481",
  90. ViewingKeyHex: "b0fa8ca43a8f07681274ddd8fa891aea4222aa8027dd516bc144317a042547c4",
  91. Address: "dERoNzsi5WW1ABhQ1UGLwoLqBU6sbzvyuS4cCi4PGzW7QRM5TH4MUf3QvZUBNJCYSDPw6K495eroGe24cf75uDdD2QwWy9pchM",
  92. },
  93. }
  94. var base58 string
  95. var spendingKey, viewingKey []byte
  96. for _, test := range tests {
  97. spendingKey, _ = hex.DecodeString(test.SpendingKeyHex)
  98. viewingKey, _ = hex.DecodeString(test.ViewingKeyHex)
  99. address, err := NewAddress(test.Address)
  100. if err != nil {
  101. t.Fatalf("%s: Failed while parsing address %s", test.name, err)
  102. continue
  103. }
  104. if address.Network != test.Network {
  105. t.Fatalf("%s: want: %d, got: %d", test.name, test.Network, address.Network)
  106. continue
  107. }
  108. if bytes.Compare(address.SpendKey[:], spendingKey) != 0 {
  109. t.Fatalf("%s: want: %x, got: %s", test.name, spendingKey, address.SpendKey)
  110. continue
  111. }
  112. if bytes.Compare(address.ViewKey[:], viewingKey) != 0 {
  113. t.Fatalf("%s: want: %x, got: %s", test.name, viewingKey, address.ViewKey)
  114. continue
  115. }
  116. base58 = address.Base58()
  117. if base58 != test.Address {
  118. t.Fatalf("%s: want: %s, got: %s", test.name, test.Address, base58)
  119. continue
  120. }
  121. }
  122. }
  123. // more explaination here https://monero.stackexchange.com/questions/1910/how-do-payment-ids-work
  124. // test case created from here https://xmr.llcoins.net/addresstests.html
  125. func TestIntegratedAddress(t *testing.T) {
  126. const Monero_MainNetwork = 18
  127. const Monero_MainNetwork_Integrated = 19
  128. const Monero_TestNetwork = 53
  129. tests := []struct {
  130. name string
  131. Network uint64
  132. NetworkI uint64
  133. SpendingKeyHex string
  134. ViewingKeyHex string
  135. PaymentID string
  136. Address string
  137. AddressI string
  138. }{
  139. {
  140. name: "generic",
  141. Network: Monero_MainNetwork,
  142. NetworkI: Monero_MainNetwork_Integrated,
  143. SpendingKeyHex: "80d3eca27896f549abc41dd941d08a4c82cff165a7f8bc4c3c0841cffd11c095",
  144. ViewingKeyHex: "7849297236cd7c0d6c69a3c8c179c038d3c1c434735741bb3c8995c3c9d6f2ac",
  145. PaymentID: "90470a40196034b5",
  146. Address: "46WGHoGHRT2DKhdr4BxzhXDoFe5NBjNm1Dka5144aXZHS13cAoUQWRq3FE2gcT3LJjAWJ6fGWq8t8YKRqwwit8vmLT6tcxK",
  147. AddressI: "4GCwJc5n2iYDKhdr4BxzhXDoFe5NBjNm1Dka5144aXZHS13cAoUQWRq3FE2gcT3LJjAWJ6fGWq8t8YKRqwwit8vmVs5oxyLeWQsMWmcgkC",
  148. },
  149. {
  150. name: "generic",
  151. Network: config.Mainnet.Public_Address_Prefix,
  152. NetworkI: config.Mainnet.Public_Address_Prefix_Integrated,
  153. SpendingKeyHex: "bd7393b76af23611e6e0eb1e4974bcb5688fceea6ad8a1b08435a4e68fcb7b8c",
  154. ViewingKeyHex: "c828aa405d78c3a0b0a7263d2cb82811d4c6ee3374ada5cc753d8196a271b3d2",
  155. PaymentID: "0cbd6e050cf3b73c",
  156. Address: "dERoiVavtPjhWkdEPp17RJLXVoHkr2ucMdEbgGgpskhLb33732LBifWMCZhPga3EcjXoYqfM9jRv3W3bnWUSpdmK5Jur1PhN6P",
  157. AddressI: "dERijfr9y7XhWkdEPp17RJLXVoHkr2ucMdEbgGgpskhLb33732LBifWMCZhPga3EcjXoYqfM9jRv3W3bnWUSpdmKL24FBjG6ctTAEg1jrhDHh",
  158. },
  159. }
  160. var base58 string
  161. var spendingKey, viewingKey []byte
  162. for _, test := range tests {
  163. spendingKey, _ = hex.DecodeString(test.SpendingKeyHex)
  164. viewingKey, _ = hex.DecodeString(test.ViewingKeyHex)
  165. address, err := NewAddress(test.Address)
  166. if err != nil {
  167. t.Fatalf("%s: Failed while parsing address %s", test.name, err)
  168. continue
  169. }
  170. if address.Network != test.Network {
  171. t.Errorf("%s: want: %d, got: %d", test.name, test.Network, address.Network)
  172. continue
  173. }
  174. if bytes.Compare(address.SpendKey[:], spendingKey) != 0 {
  175. t.Fatalf("%s: want: %x, got: %s", test.name, spendingKey, address.SpendKey)
  176. continue
  177. }
  178. if bytes.Compare(address.ViewKey[:], viewingKey) != 0 {
  179. t.Fatalf("%s: want: %x, got: %s", test.name, viewingKey, address.ViewKey)
  180. continue
  181. }
  182. base58 = address.Base58()
  183. if base58 != test.Address {
  184. t.Fatalf("%s: want: %s, got: %s", test.name, test.Address, base58)
  185. continue
  186. }
  187. address, err = NewAddress(test.AddressI)
  188. if err != nil {
  189. t.Fatalf("%s: Failed while parsing address %s", test.name, err)
  190. continue
  191. }
  192. base58 = address.Base58()
  193. if base58 != test.AddressI {
  194. t.Fatalf("%s: want: %s, got: %s", test.name, test.AddressI, base58)
  195. continue
  196. }
  197. if fmt.Sprintf("%x", address.PaymentID) != test.PaymentID {
  198. t.Fatalf("%s: PaymentID want: %s, got: %s", test.name, test.PaymentID, address.PaymentID)
  199. }
  200. }
  201. }
  202. func Test_Bruteforce_IntegratedAddress(t *testing.T) {
  203. var AddressI string = "dERijfr9y7XhWkdEPp17RJLXVoHkr2ucMdEbgGgpskhLb33732LBifWMCZhPga3EcjXoYqfM9jRv3W3bnWUSpdmKL24FBjG6ctTAEg1jrhDHh"
  204. var PaymentID string = "0cbd6e050cf3b73c"
  205. for i := 0; i < 100000;i++ {
  206. address, err := NewAddress(AddressI)
  207. if err != nil {
  208. t.Fatalf("%s: Failed while parsing address %s", AddressI, err)
  209. continue
  210. }
  211. if fmt.Sprintf("%x",address.PaymentID) != PaymentID{
  212. t.Fatalf("Payment ID failed at loop %d", i)
  213. }
  214. }
  215. }