siwe 1.0.0 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ee917f6a6a6cfe1877f32dd8c70cd2628b745c6a941f7d6bcaebd1e0c19c592
4
- data.tar.gz: 4162a2428f5a0efce7d190a1ca1bbff06c3574447853fa9dfae183301f084ab7
3
+ metadata.gz: f5c8a137e642d2e6fe2fcb52a9d79dea2580eba1cc564889cf08baee669487c3
4
+ data.tar.gz: b55b6f1645681d007f678d692611ee40600a4406ab37f0b45182d92c374bb6f7
5
5
  SHA512:
6
- metadata.gz: 648ec9080c223f0ffea368c522f4a29aa5f9b3203fe91a090133ca4143d7d637bd9b7f586de5883a2ed3e9a06473aaedb8e57ff94aa67ffc45462681cb259500
7
- data.tar.gz: e3212a3795f6dd22d584d77d59eacfa3150aa0ddf284f30f85ea129253f1f3d77afe4c1d049df8f655f50f3dafbe2748ce0df7468af562aa9f69768dd858da9d
6
+ metadata.gz: dcff7464e7f27da76e5d53209f234490e76be3f9360ce5fceed3bf62975cef6c88dba6876c1590b0821bde63e0514e04033001b555a29b1a208e01121aab0f3d
7
+ data.tar.gz: 75055a13223cde52dfcc1ac75e1be8a466a80d1445f55aa724a9304be60c281c006f636302b588c40f31684fe8cf7bbe5f1fee1221dbe58280f03f4721e36e52
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- siwe (1.0.0)
4
+ siwe (1.1.1)
5
5
  eth (~> 0.5.1)
6
6
 
7
7
  GEM
@@ -22,7 +22,7 @@ GEM
22
22
  ffi-compiler (1.0.1)
23
23
  ffi (>= 1.0.0)
24
24
  rake
25
- ipaddr (1.2.3)
25
+ ipaddr (1.2.4)
26
26
  jaro_winkler (1.5.4)
27
27
  keccak (1.3.0)
28
28
  konstructor (1.0.2)
@@ -30,7 +30,7 @@ GEM
30
30
  rexml
31
31
  kramdown-parser-gfm (1.1.0)
32
32
  kramdown (~> 2.0)
33
- mini_portile2 (2.7.1)
33
+ mini_portile2 (2.8.0)
34
34
  nokogiri (1.13.1-x86_64-linux)
35
35
  racc (~> 1.4)
36
36
  openssl (2.2.1)
data/LICENSE-APACHE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
File without changes
data/README.md CHANGED
@@ -1,2 +1,107 @@
1
1
  # siwe-ruby
2
- A ruby implementation of Sign-In with Ethereum
2
+ A Ruby implementation of EIP-4361: Sign In With Ethereum.
3
+
4
+ ## Getting started
5
+ ### Dependencies
6
+ Additional packages may be required to install the gem:
7
+
8
+ ### macOS
9
+ ```bash
10
+ brew install automake openssl libtool pkg-config gmp libffi
11
+ ```
12
+
13
+ ### Linux
14
+ ```bash
15
+ sudo apt-get install build-essential automake pkg-config libtool \
16
+ libffi-dev libssl-dev libgmp-dev python-dev
17
+ ```
18
+
19
+ After installing any required dependencies SIWE can be easily installed with:
20
+ ```bash
21
+ gem install siwe
22
+ ```
23
+
24
+ ## Usage
25
+ SIWE provides a Message class which implements EIP-4361.
26
+ ### Creating a SIWE Message
27
+
28
+ ```ruby
29
+ require 'siwe'
30
+ require 'time'
31
+
32
+ # Only the mandatory arguments
33
+ Siwe::Message.new("domain.example", "0x9D85ca56217D2bb651b00f15e694EB7E713637D4", "some.uri", "1")
34
+
35
+ # Complete SIWE message with default values
36
+ Siwe::Message.new("domain.example", "0x9D85ca56217D2bb651b00f15e694EB7E713637D4", "some.uri", "1", {
37
+ issued_at: Time.now.utc.iso8601,
38
+ statement: "Example statement for SIWE",
39
+ nonce: Siwe::Util.generate_nonce,
40
+ chain_id: "1",
41
+ expiration_time: "",
42
+ not_before: "",
43
+ request_id: "",
44
+ resources: []
45
+ })
46
+ ```
47
+
48
+ ### Parsing a SIWE Message
49
+ To parse from EIP-4361 use `Siwe::Message.from_message`
50
+
51
+ ```ruby
52
+ require 'siwe'
53
+
54
+ Siwe::Message.from_message "domain.example wants you to sign in with your Ethereum account:\n0x9D85ca56217D2bb651b00f15e694EB7E713637D4\n\nExample statement for SIWE\n\nURI: some.uri\nVersion: 1\nChain ID: 1\nNonce: k1Ne4KWzBHYEFQo8\nIssued At: 2022-02-03T20:06:19Z"
55
+ ```
56
+
57
+ Messages can be parsed to and from JSON strings, using Siwe::Message.from_json_string and Siwe::Message.to_json_string respectively:
58
+
59
+ ```ruby
60
+ require 'siwe'
61
+
62
+ Siwe::Message.from_json_string "{\"domain\":\"domain.example\",\"address\":\"0x9D85ca56217D2bb651b00f15e694EB7E713637D4\",\"uri\":\"some.uri\",\"version\":\"1\",\"chain_id\":\"1\",\"nonce\":\"k1Ne4KWzBHYEFQo8\",\"issued_at\":\"2022-02-03T20:06:19Z\",\"statement\":\"Example statement for SIWE\",\"expiration_time\":\"\",\"not_before\":\"\",\"request_id\":\"\",\"resources\":[]}"
63
+
64
+ Siwe::Message.new("domain.example", "0x9D85ca56217D2bb651b00f15e694EB7E713637D4", "some.uri", "1").to_json_string
65
+ ```
66
+
67
+ ## Verifying and Authenticating a SIWE Message
68
+ Verification and authentication is performed via EIP-191, using the address field of the SiweMessage as the expected signer. The validate method checks message structural integrity, signature address validity, and time-based validity attributes.
69
+
70
+ ```ruby
71
+ begin
72
+ message.validate(signature) # returns true if valid throws otherwise
73
+ rescue Siwe::ExpiredMessage
74
+ # Used when the message is already expired. (Expires At < Time.now)
75
+ rescue Siwe::NotValidMessage
76
+ # Used when the message is not yet valid. (Not Before > Time.now)
77
+ rescue Siwe::InvalidSignature
78
+ # Used when the signature doesn't correspond to the address of the message.
79
+ end
80
+ ```
81
+
82
+ ## Serialization of a SIWE Message
83
+ `Siwe::Message` instances can also be serialized as their EIP-4361 string representations via the `Siwe::Message.prepare_message` method:
84
+
85
+ ```ruby
86
+ require 'siwe'
87
+
88
+ Siwe::Message.new("domain.example", "0x9D85ca56217D2bb651b00f15e694EB7E713637D4", "some.uri", "1").prepare_message
89
+ ```
90
+
91
+ ## Example
92
+ Parsing and verifying a `Siwe::Message`:
93
+ ```ruby
94
+ require 'siwe'
95
+
96
+ begin
97
+ message = Siwe::Message.from_message "https://example.com wants you to sign in with your Ethereum account:\n0xA712a0AFBFA8656581BfA96352c9EdFc519e9cad\n\n\nURI: https://example.com\nVersion: 1\nChain ID: 1\nNonce: 9WrH24z8zpiYOoBQ\nIssued At: 2022-02-04T15:52:03Z"
98
+ message.validate "aca5e5649a357cee608ecbd1a8455b4143311381636b88a66ec7bcaf64b3a4743ff2c7cc18501a3401e182f79233dc73fc56d01506a6098d5e7e4d881bbb02921c"
99
+ puts "Congrats, your message is valid"
100
+ rescue Siwe::ExpiredMessage
101
+ # Used when the message is already expired. (Expires At < Time.now)
102
+ rescue Siwe::NotValidMessage
103
+ # Used when the message is not yet valid. (Not Before > Time.now)
104
+ rescue Siwe::InvalidSignature
105
+ # Used when the signature doesn't correspond to the address of the message.
106
+ end
107
+ ```
@@ -8,6 +8,13 @@ module Siwe
8
8
  end
9
9
  end
10
10
 
11
+ # Used when the address does not conform to EIP-55 or is invalid.
12
+ class InvalidAddress < StandardError
13
+ def initialize(msg = "Address does not conform to EIP-55 or is invalid.")
14
+ super
15
+ end
16
+ end
17
+
11
18
  # Used when the message is not yet valid. (Not Before > Time.now)
12
19
  class NotValidMessage < StandardError
13
20
  def initialize(msg = "Message not yet valid.")
data/lib/siwe/message.rb CHANGED
@@ -76,10 +76,15 @@ module Siwe
76
76
 
77
77
  def initialize(domain, address, uri, version, options = {})
78
78
  @domain = domain
79
- @address = address
79
+ begin
80
+ @address = Eth::Address.new(address).to_s
81
+ rescue StandardError
82
+ raise Siwe::InvalidAddress
83
+ end
84
+ raise Siwe::InvalidAddress unless @address.eql? address
85
+
80
86
  @uri = uri
81
87
  @version = version
82
-
83
88
  @statement = options.fetch :statement, ""
84
89
  @issued_at = options.fetch :issued_at, Time.now.utc.iso8601
85
90
  @nonce = options.fetch :nonce, Siwe::Util.generate_nonce
@@ -94,7 +99,7 @@ module Siwe
94
99
  if (message = msg.match SIWE_MESSAGE)
95
100
  new(
96
101
  message[:domain],
97
- message[:address],
102
+ Eth::Address.new(message[:address]).to_s,
98
103
  message[:uri],
99
104
  message[:version],
100
105
  {
@@ -117,7 +122,7 @@ module Siwe
117
122
  def to_json_string
118
123
  obj = {
119
124
  domain: @domain,
120
- address: @address,
125
+ address: Eth::Address.new(@address).to_s,
121
126
  uri: @uri,
122
127
  version: @version,
123
128
  chain_id: @chain_id,
@@ -157,6 +162,9 @@ module Siwe
157
162
 
158
163
  raise Siwe::InvalidSignature if signature.empty?
159
164
 
165
+ raise Siwe::InvalidAddress unless @address.eql?(Eth::Address.new(@address).to_s)
166
+
167
+ puts "whatever"
160
168
  begin
161
169
  pub_key = Eth::Signature.personal_recover prepare_message, signature
162
170
  signature_address = Eth::Util.public_key_to_address pub_key
data/lib/siwe/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Siwe
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.2"
5
5
  end
data/lib/siwe.rb CHANGED
@@ -9,6 +9,7 @@ module Siwe
9
9
  autoload :ExpiredMessage, "siwe/exceptions"
10
10
  autoload :NotValidMessage, "siwe/exceptions"
11
11
  autoload :InvalidSignature, "siwe/exceptions"
12
+ autoload :InvalidAddress, "siwe/exceptions"
12
13
 
13
14
  class Error < StandardError; end
14
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: siwe
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Spruce Systems Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-03 00:00:00.000000000 Z
11
+ date: 2022-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eth
@@ -94,8 +94,8 @@ files:
94
94
  - CODE_OF_CONDUCT.md
95
95
  - Gemfile
96
96
  - Gemfile.lock
97
- - LICENSE
98
- - LICENSE.txt
97
+ - LICENSE-APACHE
98
+ - LICENSE-MIT
99
99
  - README.md
100
100
  - Rakefile
101
101
  - bin/console
data/LICENSE.txt DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2021 Gregório Granado Magalhães
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.