ring_sig 0.1.0 → 0.2.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.
- checksums.yaml +13 -5
- data/.travis.yml +3 -1
- data/.yardopts +5 -1
- data/CHANGELOG.md +61 -0
- data/README.md +10 -1
- data/lib/ring_sig.rb +14 -0
- data/lib/ring_sig/hasher.rb +9 -8
- data/lib/ring_sig/private_key.rb +27 -15
- data/lib/ring_sig/public_key.rb +30 -11
- data/lib/ring_sig/signature.rb +37 -16
- data/lib/ring_sig/version.rb +2 -1
- data/ring_sig.gemspec +1 -1
- data/spec/hasher_spec.rb +2 -2
- data/spec/private_key_spec.rb +34 -0
- metadata +24 -23
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YWJjNzNiMmVjMTJjMDY1YzU2M2QyY2MxM2ExZDkwYTQxNzUwMmE5MA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MDhiZDVlZTVmYzc2YWZkYTIxY2U1NjgyOWNlMzY2YWIyM2E0MDAxMQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YzdiMzZkNzBlNTY2M2U3NzY1NmE5NTViZTJkYWY5ZjFjMzg5MjIyYzNiM2E3
|
10
|
+
MjBhN2EyNmVmOTdiMTQwYzdmODliOGIyNzJkMzdiYzIzMmVkMGZiNThiZTQ2
|
11
|
+
MmFhZDcwZWZjMDY2ZDcyZDgxOWI4ZjY1ZDUzM2IzNTA4NWI2YzU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZWMxNjk0YzE3NzM0YmQzYjcwMDdjM2NiODBhYWFlNTA1MmQ5MmQxNWY4MDQ1
|
14
|
+
Njk4M2E1ZGM4OTA3MmQ5ZTMwZThiYmY4ZTRhZTA4ZmE2MmNlZTZiMTYzMGY4
|
15
|
+
ZWU1MTQ2ZmZlNDk2ZTUzMjUyMmRjMTFhOWY2OGU4ZGU1NjFlMmE=
|
data/.travis.yml
CHANGED
data/.yardopts
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
Change log
|
2
|
+
====
|
3
|
+
|
4
|
+
This gem follows [Semantic Versioning 2.0.0](http://semver.org/spec/v2.0.0.html).
|
5
|
+
All classes and public methods are part of the public API, unless explicitly
|
6
|
+
noted otherwise in their documentation.
|
7
|
+
|
8
|
+
0.2.0
|
9
|
+
----
|
10
|
+
Released on 2014-09-12
|
11
|
+
|
12
|
+
This release breaks API compatibility with version 0.1.0.
|
13
|
+
|
14
|
+
- Add support for ruby 1.9, including jruby-19mode.
|
15
|
+
- Add `RingSig.default_group` and `RingSig.defaut_hash_algorithm` attributes.
|
16
|
+
- Change `Hasher` constructor so that `group` and `hash_algorithm` attributes
|
17
|
+
are passed in as options rather than explicit arguments.
|
18
|
+
|
19
|
+
|
20
|
+
0.1.0
|
21
|
+
----
|
22
|
+
Released on 2014-09-11
|
23
|
+
|
24
|
+
This release breaks API compatibility with version 0.0.1.
|
25
|
+
|
26
|
+
- Split the `Key` class into `PrivateKey` and `PublicKey`, which better
|
27
|
+
encapsulate the functionality of each.
|
28
|
+
- The `sign` and `key_image` methods are placed in the `PrivateKey` class.
|
29
|
+
- Remove the `drop_private_key` method from `Key`. Instead, a new method simply
|
30
|
+
called `public_key` is included in both `PrivateKey` and `PublicKey`.
|
31
|
+
- Add methods `to_hex`, `to_octet`, `from_hex`, and `from_octet` to both
|
32
|
+
`PrivateKey` and `PublicKey` classes.
|
33
|
+
- Add `==` methods to `PrivateKey` and `PublicKey`
|
34
|
+
- Add `point` attribute to `PublicKey` which stores the actual public key.
|
35
|
+
- Add `point` method to `PrivateKey` which references the public key's point.
|
36
|
+
- Add `value` attribute to `PrivateKey` which stores the actual private key.
|
37
|
+
|
38
|
+
0.0.1
|
39
|
+
----
|
40
|
+
Released on 2014-09-09
|
41
|
+
|
42
|
+
All core functionality is implemented:
|
43
|
+
|
44
|
+
- `Key` class
|
45
|
+
- `sign` method
|
46
|
+
- `key_image` method
|
47
|
+
- `drop_private_key` method
|
48
|
+
- `public_key` and `private_key` attributes
|
49
|
+
- `group` and `hash_algorithm` attributes
|
50
|
+
- `Signature` class
|
51
|
+
- `verify` method
|
52
|
+
- `components` method
|
53
|
+
- `to_hex`, `to_der`, `from_hex`, and `from_der` methods
|
54
|
+
- `key_image`, `c_array`, and `r_array` attributes
|
55
|
+
- `group` and `hash_algorithm` attributes
|
56
|
+
- `Hasher` class
|
57
|
+
- `hash_string` method
|
58
|
+
- `hash_array` method
|
59
|
+
- `hash_point` method
|
60
|
+
- `shuffle` method
|
61
|
+
- `group` and `algorithm` attributes
|
data/README.md
CHANGED
@@ -92,6 +92,15 @@ ECDSA group. You can specify alternates if you'd like:
|
|
92
92
|
key = RingSig::PrivateKey.new(1, group: ECDSA::Group::Secp256r1, hash_algorithm: OpenSSL::Digest::RIPEMD160)
|
93
93
|
```
|
94
94
|
|
95
|
+
You can also specify module-wide alternate defaults:
|
96
|
+
```ruby
|
97
|
+
RingSig.default_group = ECDSA::Group::Secp256r1
|
98
|
+
RingSig.default_hash_algorithm = OpenSSL::Digest::RIPEMD160
|
99
|
+
key = RingSig::PrivateKey.new(1)
|
100
|
+
puts key.group # ECDSA::Group::Secp256r1
|
101
|
+
puts key.hash_algorithm # OpenSSL::Digest::RIPEMD160
|
102
|
+
```
|
103
|
+
|
95
104
|
## Standards
|
96
105
|
|
97
106
|
There currently aren't any standards around Ring Signatures that I know of. This
|
@@ -111,7 +120,7 @@ If you'd like to contribute code, these are the general steps:
|
|
111
120
|
|
112
121
|
1. Fork and clone the repository
|
113
122
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
114
|
-
3. Commit your changes (`git commit -
|
123
|
+
3. Commit your changes (`git commit -m 'Added some feature'`)
|
115
124
|
4. Push to the branch (`git push origin my-new-feature`)
|
116
125
|
5. Create a Pull Request
|
117
126
|
|
data/lib/ring_sig.rb
CHANGED
@@ -9,4 +9,18 @@ require 'ring_sig/ecdsa/point'
|
|
9
9
|
|
10
10
|
# The top-level module for the RingSig gem.
|
11
11
|
module RingSig
|
12
|
+
class << self
|
13
|
+
# @return [ECDSA::Group] the default group. This group will be used in any
|
14
|
+
# method in the RingSig library that calls for a group, if none is
|
15
|
+
# specified. Starts as `ECDSA::Group::Secp256k1`.
|
16
|
+
attr_accessor :default_group
|
17
|
+
|
18
|
+
# @return [#digest] the default hash algorithm. This hash algorithm will be
|
19
|
+
# used in any method in the RingSig library that calls for a hash
|
20
|
+
# algorithm, if none is specified. Starts as `OpenSSL::Digest::SHA256`.
|
21
|
+
attr_accessor :default_hash_algorithm
|
22
|
+
end
|
23
|
+
|
24
|
+
self.default_group = ECDSA::Group::Secp256k1
|
25
|
+
self.default_hash_algorithm = OpenSSL::Digest::SHA256
|
12
26
|
end
|
data/lib/ring_sig/hasher.rb
CHANGED
@@ -5,16 +5,17 @@ module RingSig
|
|
5
5
|
attr_reader :group
|
6
6
|
|
7
7
|
# @return [#digest]
|
8
|
-
attr_reader :
|
9
|
-
|
8
|
+
attr_reader :hash_algorithm
|
10
9
|
|
11
10
|
# Creates a new instance of {Hasher}.
|
12
11
|
#
|
13
|
-
# @param
|
14
|
-
# @
|
15
|
-
|
16
|
-
|
17
|
-
@
|
12
|
+
# @param opts [Hash]
|
13
|
+
# @option opts :group [ECDSA::Group]
|
14
|
+
# @option opts :hash_algorithm [#digest]
|
15
|
+
def initialize(opts = {})
|
16
|
+
@group = opts.delete(:group) { RingSig.default_group }
|
17
|
+
@hash_algorithm = opts.delete(:hash_algorithm) { RingSig.default_hash_algorithm }
|
18
|
+
raise ArgumentError, "Unknown options #{opts.keys.join(', ')}" unless opts.empty?
|
18
19
|
end
|
19
20
|
|
20
21
|
# Continuously hashes until a value less than the group's order is found.
|
@@ -24,7 +25,7 @@ module RingSig
|
|
24
25
|
def hash_string(s)
|
25
26
|
n = nil
|
26
27
|
loop do
|
27
|
-
s = @
|
28
|
+
s = @hash_algorithm.digest(s)
|
28
29
|
n = s.unpack('H*').first.to_i(16)
|
29
30
|
break if n < @group.order
|
30
31
|
end
|
data/lib/ring_sig/private_key.rb
CHANGED
@@ -20,38 +20,50 @@ module RingSig
|
|
20
20
|
# Creates a new instance of {PrivateKey}.
|
21
21
|
#
|
22
22
|
# @param value [Integer]
|
23
|
-
# @param
|
24
|
-
# @
|
25
|
-
|
23
|
+
# @param opts [Hash]
|
24
|
+
# @option opts :group [ECDSA::Group]
|
25
|
+
# @option opts :hash_algorithm [#digest]
|
26
|
+
def initialize(value, opts = {})
|
27
|
+
@group = opts.delete(:group) { RingSig.default_group }
|
28
|
+
@hash_algorithm = opts.delete(:hash_algorithm) { RingSig.default_hash_algorithm }
|
29
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
30
|
+
|
26
31
|
raise ArgumentError, "Value is not an integer" unless value.is_a?(Integer)
|
27
32
|
raise ArgumentError, "Value is too small" if value < 1
|
28
33
|
raise ArgumentError, "Value is too large" if value >= group.order
|
29
34
|
|
30
35
|
@value = value
|
31
36
|
@public_key = PublicKey.new(group.generator.multiply_by_scalar(value), group: group)
|
32
|
-
|
33
|
-
@group = group
|
34
|
-
@hash_algorithm = hash_algorithm
|
35
|
-
@hasher = Hasher.new(group, hash_algorithm)
|
37
|
+
@hasher = Hasher.new(group: group, hash_algorithm: hash_algorithm)
|
36
38
|
end
|
37
39
|
|
38
40
|
# Creates a new instance of {PrivateKey} from a hex string.
|
39
41
|
#
|
40
|
-
# @param
|
41
|
-
# @param
|
42
|
-
# @
|
42
|
+
# @param hex_string [String]
|
43
|
+
# @param opts [Hash]
|
44
|
+
# @option opts :group [ECDSA::Group]
|
45
|
+
# @option opts :hash_algorithm [#digest]
|
43
46
|
# @return [PrivateKey]
|
44
|
-
def self.from_hex(hex_string,
|
47
|
+
def self.from_hex(hex_string, opts = {})
|
48
|
+
group = opts.delete(:group) { RingSig.default_group }
|
49
|
+
hash_algorithm = opts.delete(:hash_algorithm) { RingSig.default_hash_algorithm }
|
50
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
51
|
+
|
45
52
|
self.from_octet([hex_string].pack('H*'), group: group, hash_algorithm: hash_algorithm)
|
46
53
|
end
|
47
54
|
|
48
55
|
# Creates a new instance of {PrivateKey} from an octet string.
|
49
56
|
#
|
50
57
|
# @param octet_string [String]
|
51
|
-
# @param
|
52
|
-
# @
|
58
|
+
# @param opts [Hash]
|
59
|
+
# @option opts :group [ECDSA::Group]
|
60
|
+
# @option opts :hash_algorithm [#digest]
|
53
61
|
# @return [PrivateKey]
|
54
|
-
def self.from_octet(octet_string,
|
62
|
+
def self.from_octet(octet_string, opts = {})
|
63
|
+
group = opts.delete(:group) { RingSig.default_group }
|
64
|
+
hash_algorithm = opts.delete(:hash_algorithm) { RingSig.default_hash_algorithm }
|
65
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
66
|
+
|
55
67
|
value = ECDSA::Format::FieldElementOctetString.decode(octet_string, group.field)
|
56
68
|
PrivateKey.new(value, group: group, hash_algorithm: hash_algorithm)
|
57
69
|
end
|
@@ -96,7 +108,7 @@ module RingSig
|
|
96
108
|
c_array, r_array = generate_c_r(all_keys, q_array, w_array, challenge)
|
97
109
|
|
98
110
|
public_keys = all_keys.map(&:public_key)
|
99
|
-
signature = Signature.new(key_image, c_array, r_array, group: group, hash_algorithm:
|
111
|
+
signature = Signature.new(key_image, c_array, r_array, group: group, hash_algorithm: hash_algorithm)
|
100
112
|
|
101
113
|
[signature, public_keys]
|
102
114
|
end
|
data/lib/ring_sig/public_key.rb
CHANGED
@@ -13,30 +13,41 @@ module RingSig
|
|
13
13
|
# Creates a new instance of {PublicKey}.
|
14
14
|
#
|
15
15
|
# @param point [ECDSA::Point]
|
16
|
-
# @param
|
17
|
-
|
16
|
+
# @param opts [Hash]
|
17
|
+
# @option opts :group [ECDSA::Group]
|
18
|
+
def initialize(point, opts = {})
|
19
|
+
@group = opts.delete(:group) { RingSig.default_group }
|
20
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
21
|
+
|
18
22
|
raise ArgumentError, "Point is not an ECDSA::Point" unless point.is_a?(ECDSA::Point)
|
19
23
|
raise ArgumentError, "Point is not on the group's curve" unless group.include?(point)
|
20
24
|
|
21
25
|
@point = point
|
22
|
-
@group = group
|
23
26
|
end
|
24
27
|
|
25
28
|
# Creates a new instance of {PublicKey} from a hex string.
|
26
29
|
#
|
27
30
|
# @param hex_string [String]
|
28
|
-
# @param
|
31
|
+
# @param opts [Hash]
|
32
|
+
# @option opts :group [ECDSA::Group]
|
29
33
|
# @return [PublicKey]
|
30
|
-
def self.from_hex(hex_string,
|
34
|
+
def self.from_hex(hex_string, opts = {})
|
35
|
+
group = opts.delete(:group) { RingSig.default_group }
|
36
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
37
|
+
|
31
38
|
self.from_octet([hex_string].pack('H*'), group: group)
|
32
39
|
end
|
33
40
|
|
34
41
|
# Creates a new instance of {PublicKey} from an octet string.
|
35
42
|
#
|
36
43
|
# @param octet_string [String]
|
37
|
-
# @param
|
44
|
+
# @param opts [Hash]
|
45
|
+
# @option opts :group [ECDSA::Group]
|
38
46
|
# @return [PublicKey]
|
39
|
-
def self.from_octet(octet_string,
|
47
|
+
def self.from_octet(octet_string, opts = {})
|
48
|
+
group = opts.delete(:group) { RingSig.default_group }
|
49
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
50
|
+
|
40
51
|
point = ECDSA::Format::PointOctetString.decode(octet_string, group)
|
41
52
|
PublicKey.new(point, group: group)
|
42
53
|
end
|
@@ -44,18 +55,26 @@ module RingSig
|
|
44
55
|
# Encodes this public key into an octet string. The encoded data contains
|
45
56
|
# only the point. It does not contain the group.
|
46
57
|
#
|
47
|
-
# @param
|
58
|
+
# @param opts [Hash]
|
59
|
+
# @option opts :compression [Boolean]
|
48
60
|
# @return [String]
|
49
|
-
def to_hex(
|
61
|
+
def to_hex(opts = {})
|
62
|
+
compression = opts.delete(:compression) { true }
|
63
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
64
|
+
|
50
65
|
to_octet(compression: compression).unpack('H*').first
|
51
66
|
end
|
52
67
|
|
53
68
|
# Encodes this public key into a hex string. The encoded data contains
|
54
69
|
# only the point. It does not contain the group.
|
55
70
|
#
|
56
|
-
# @param
|
71
|
+
# @param opts [Hash]
|
72
|
+
# @option opts :compression [Boolean]
|
57
73
|
# @return [String]
|
58
|
-
def to_octet(
|
74
|
+
def to_octet(opts = {})
|
75
|
+
compression = opts.delete(:compression) { true }
|
76
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
77
|
+
|
59
78
|
ECDSA::Format::PointOctetString.encode(point, compression: compression)
|
60
79
|
end
|
61
80
|
|
data/lib/ring_sig/signature.rb
CHANGED
@@ -21,26 +21,34 @@ module RingSig
|
|
21
21
|
# @param key_image [ECDSA::Point]
|
22
22
|
# @param c_array [Array<Integer>]
|
23
23
|
# @param r_array [Array<Integer>]
|
24
|
-
# @param
|
25
|
-
# @
|
26
|
-
|
24
|
+
# @param opts [Hash]
|
25
|
+
# @option opts :group [ECDSA::Group]
|
26
|
+
# @option opts :hash_algorithm [#digest]
|
27
|
+
def initialize(key_image, c_array, r_array, opts = {})
|
28
|
+
@group = opts.delete(:group) { RingSig.default_group }
|
29
|
+
@hash_algorithm = opts.delete(:hash_algorithm) { RingSig.default_hash_algorithm }
|
30
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
31
|
+
|
27
32
|
@key_image, @c_array, @r_array = key_image, c_array, r_array
|
28
33
|
key_image.is_a?(ECDSA::Point) or raise ArgumentError, 'key_image is not an ECDSA::Point.'
|
29
34
|
c_array.is_a?(Array) or raise ArgumentError, 'c_array is not an array.'
|
30
35
|
r_array.is_a?(Array) or raise ArgumentError, 'r_array is not an array.'
|
31
36
|
|
32
|
-
@
|
33
|
-
@hash_algorithm = hash_algorithm
|
34
|
-
@hasher = Hasher.new(group, hash_algorithm)
|
37
|
+
@hasher = Hasher.new(group: group, hash_algorithm: hash_algorithm)
|
35
38
|
end
|
36
39
|
|
37
40
|
# Creates a new instance of {Signature} from a der string.
|
38
41
|
#
|
39
42
|
# @param der_string [String]
|
40
|
-
# @param
|
41
|
-
# @
|
43
|
+
# @param opts [Hash]
|
44
|
+
# @option opts :group [ECDSA::Group]
|
45
|
+
# @option opts :hash_algorithm [#digest]
|
42
46
|
# @return [Signature]
|
43
|
-
def self.from_der(der_string,
|
47
|
+
def self.from_der(der_string, opts = {})
|
48
|
+
group = opts.delete(:group) { RingSig.default_group }
|
49
|
+
hash_algorithm = opts.delete(:hash_algorithm) { RingSig.default_hash_algorithm }
|
50
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
51
|
+
|
44
52
|
asn1 = OpenSSL::ASN1.decode(der_string)
|
45
53
|
|
46
54
|
key_image = ECDSA::Format::PointOctetString.decode(asn1.value[0].value, group)
|
@@ -53,10 +61,15 @@ module RingSig
|
|
53
61
|
# Creates a new instance of {Signature} from a hex string.
|
54
62
|
#
|
55
63
|
# @param hex_string [String]
|
56
|
-
# @param
|
57
|
-
# @
|
64
|
+
# @param opts [Hash]
|
65
|
+
# @option opts :group [ECDSA::Group]
|
66
|
+
# @option opts :hash_algorithm [#digest]
|
58
67
|
# @return [Signature]
|
59
|
-
def self.from_hex(hex_string,
|
68
|
+
def self.from_hex(hex_string, opts = {})
|
69
|
+
group = opts.delete(:group) { RingSig.default_group }
|
70
|
+
hash_algorithm = opts.delete(:hash_algorithm) { RingSig.default_hash_algorithm }
|
71
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
72
|
+
|
60
73
|
Signature.from_der([hex_string].pack('H*'), group: group, hash_algorithm: hash_algorithm)
|
61
74
|
end
|
62
75
|
|
@@ -64,9 +77,13 @@ module RingSig
|
|
64
77
|
# the key_image, c_array, and r_array. It does not contain the group
|
65
78
|
# or hash_algorithm.
|
66
79
|
#
|
67
|
-
# @param
|
80
|
+
# @param opts [Hash]
|
81
|
+
# @option opts :compression [Boolean]
|
68
82
|
# @return [String]
|
69
|
-
def to_der(
|
83
|
+
def to_der(opts = {})
|
84
|
+
compression = opts.delete(:compression) { true }
|
85
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
86
|
+
|
70
87
|
OpenSSL::ASN1::Sequence.new([
|
71
88
|
OpenSSL::ASN1::OctetString.new(ECDSA::Format::PointOctetString.encode(key_image, compression: compression)),
|
72
89
|
OpenSSL::ASN1::Sequence.new(c_array.map{|i| OpenSSL::ASN1::Integer.new(i)}),
|
@@ -78,9 +95,13 @@ module RingSig
|
|
78
95
|
# the key_image, c_array, and r_array. It does not contain the group
|
79
96
|
# or hash_algorithm.
|
80
97
|
#
|
81
|
-
# @param
|
98
|
+
# @param opts [Hash]
|
99
|
+
# @option opts :compression [Boolean]
|
82
100
|
# @return [String]
|
83
|
-
def to_hex(
|
101
|
+
def to_hex(opts = {})
|
102
|
+
compression = opts.delete(:compression) { true }
|
103
|
+
raise ArgumentError, "Unknown opts: #{opts.keys.join(', ')}" unless opts.empty?
|
104
|
+
|
84
105
|
to_der(compression: compression).unpack('H*').first
|
85
106
|
end
|
86
107
|
|
data/lib/ring_sig/version.rb
CHANGED
data/ring_sig.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.add_development_dependency 'simplecov', '~> 0'
|
21
21
|
s.add_development_dependency 'yard', '~> 0'
|
22
22
|
s.add_development_dependency 'markdown', '~> 1'
|
23
|
-
s.add_development_dependency 'redcarpet', '~> 3'
|
23
|
+
s.add_development_dependency 'redcarpet', '~> 3' unless RUBY_PLATFORM == 'java'
|
24
24
|
|
25
25
|
s.add_runtime_dependency 'ecdsa', '~> 1.1'
|
26
26
|
end
|
data/spec/hasher_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe RingSig::Hasher do
|
|
4
4
|
context 'Standard: SHA256 hash algorithm, secp256k1 group' do
|
5
5
|
group = ECDSA::Group::Secp256k1
|
6
6
|
hash_algorithm = OpenSSL::Digest::SHA256
|
7
|
-
hasher = RingSig::Hasher.new(group, hash_algorithm)
|
7
|
+
hasher = RingSig::Hasher.new(group: group, hash_algorithm: hash_algorithm)
|
8
8
|
|
9
9
|
describe '#hash_string' do
|
10
10
|
it 'hashes "a"' do
|
@@ -67,7 +67,7 @@ describe RingSig::Hasher do
|
|
67
67
|
SimpleHashAlgorithm
|
68
68
|
end
|
69
69
|
|
70
|
-
let(:hasher) { RingSig::Hasher.new(group, hash_algorithm) }
|
70
|
+
let(:hasher) { RingSig::Hasher.new(group: group, hash_algorithm: hash_algorithm) }
|
71
71
|
|
72
72
|
# We test the hash_algorithm itself in this context, since we implemented our own simple hash_algorithm.
|
73
73
|
shared_examples_for 'hash algorithm' do |input, expected_value|
|
data/spec/private_key_spec.rb
CHANGED
@@ -104,4 +104,38 @@ describe RingSig::PrivateKey do
|
|
104
104
|
expect(sig.verify(message, public_keys)).to be true
|
105
105
|
end
|
106
106
|
end
|
107
|
+
|
108
|
+
context 'alternate defaults' do
|
109
|
+
before(:all) do
|
110
|
+
@old_default_group = RingSig.default_group
|
111
|
+
@old_default_hash_algorithm = RingSig.default_hash_algorithm
|
112
|
+
RingSig.default_group = ECDSA::Group::Secp256r1
|
113
|
+
RingSig.default_hash_algorithm = OpenSSL::Digest::RIPEMD160
|
114
|
+
|
115
|
+
@key = RingSig::PrivateKey.new(1)
|
116
|
+
@foreign_keys = [
|
117
|
+
RingSig::PrivateKey.new(2).public_key,
|
118
|
+
RingSig::PrivateKey.new(3).public_key,
|
119
|
+
RingSig::PrivateKey.new(4).public_key,
|
120
|
+
]
|
121
|
+
end
|
122
|
+
|
123
|
+
after(:all) do
|
124
|
+
RingSig.default_group = @old_default_group
|
125
|
+
RingSig.default_hash_algorithm = @old_default_hash_algorithm
|
126
|
+
end
|
127
|
+
|
128
|
+
describe '#sign' do
|
129
|
+
it 'signs and verifies' do
|
130
|
+
sig, public_keys = @key.sign(message, @foreign_keys)
|
131
|
+
|
132
|
+
expect(sig.to_hex).to eq '3081e804210242ea46f23d6dc4e4515f2b1001734cf2c4a09b9ab169a588bf01a13b9e553de03067022100ffffffff00000000fffffffe714565846c5397cd4e5e24b41dfd02b75761d074021500881bf1e9c67d05c7a8a6ef93552a785246603436021500e17e885e1b5c59e80a5ed90ae26bea5067b3314a02146655e2724456f7d8d21238d797e0a809a3013337305a02150198482b6231394361df3ad5b577c70953b2572c9f02141cd9f8cc0df48519ecd6ad6e354ca634c8b604c20214361d1207afcdb5c041df20efac5496b26243403a0215008fddaf160ecfaed0c2048e6f018c933fc398e33b'
|
133
|
+
|
134
|
+
expected_public_keys = [0, 2, 1, 3].map{|i| ([@key] + @foreign_keys)[i].public_key}
|
135
|
+
expect(public_keys).to eq expected_public_keys
|
136
|
+
|
137
|
+
expect(sig.verify(message, public_keys)).to be true
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
107
141
|
end
|
metadata
CHANGED
@@ -1,125 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ring_sig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McCarthy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '10'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '3.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: yard
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: markdown
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '1'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ~>
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '1'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: redcarpet
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ~>
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '3'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '3'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: ecdsa
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '1.1'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ~>
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '1.1'
|
125
125
|
description: Ring Signatures allow someone to non-interactively sign a message which
|
@@ -129,9 +129,10 @@ executables: []
|
|
129
129
|
extensions: []
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
|
-
-
|
133
|
-
-
|
134
|
-
-
|
132
|
+
- .gitignore
|
133
|
+
- .travis.yml
|
134
|
+
- .yardopts
|
135
|
+
- CHANGELOG.md
|
135
136
|
- Gemfile
|
136
137
|
- LICENSE
|
137
138
|
- README.md
|
@@ -159,12 +160,12 @@ require_paths:
|
|
159
160
|
- lib
|
160
161
|
required_ruby_version: !ruby/object:Gem::Requirement
|
161
162
|
requirements:
|
162
|
-
- -
|
163
|
+
- - ! '>='
|
163
164
|
- !ruby/object:Gem::Version
|
164
165
|
version: '0'
|
165
166
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
167
|
requirements:
|
167
|
-
- -
|
168
|
+
- - ! '>='
|
168
169
|
- !ruby/object:Gem::Version
|
169
170
|
version: '0'
|
170
171
|
requirements: []
|