schnorr_sig 1.0.0.1 → 1.0.0.2
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 +4 -4
- data/Rakefile +8 -1
- data/VERSION +1 -1
- data/lib/schnorr_sig/pure.rb +3 -5
- data/lib/schnorr_sig/utils.rb +8 -6
- data/schnorr_sig.gemspec +1 -0
- data/sig/fast.rbs +15 -0
- data/sig/pure.rbs +24 -0
- data/sig/utils.rbs +18 -0
- data/test/utils.rb +3 -3
- data/test/vectors.rb +1 -2
- data/test/vectors_extra.rb +12 -8
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d07355d7c8e4e0ce43bd586ba7cea831b72d2fd40b6c2efa1d49c46c536ab3ab
|
4
|
+
data.tar.gz: 346f2e23f326259d0e86f0837377e03cef56518b31828b22d3f7fa7ddca8b76b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f91e124755a889779f7b5bda0991f9cd082078c855a5f8bcf2fe30886b779d5033d712801d776558bc454a5e5ba1a219fbd05f66b77dfd53098551dc7d6462e1
|
7
|
+
data.tar.gz: 7709c7e780d437dce791ac7f959350b71622c05c9838cdd6f5173fef3f232ace1a2e4b258ba56f697c4025266fab6e7b8ab0e0f6a77358d07880412963ae717f
|
data/Rakefile
CHANGED
@@ -4,7 +4,6 @@ Rake::TestTask.new :test do |t|
|
|
4
4
|
t.test_files = [
|
5
5
|
'test/utils.rb',
|
6
6
|
'test/pure.rb',
|
7
|
-
'test/vectors.rb',
|
8
7
|
]
|
9
8
|
t.warning = true
|
10
9
|
end
|
@@ -17,6 +16,14 @@ Rake::TestTask.new :vectors do |t|
|
|
17
16
|
t.warning = true
|
18
17
|
end
|
19
18
|
|
19
|
+
Rake::TestTask.new :fast do |t|
|
20
|
+
t.test_files = [
|
21
|
+
'test/utils.rb',
|
22
|
+
'test/fast.rb',
|
23
|
+
]
|
24
|
+
t.warning = true
|
25
|
+
end
|
26
|
+
|
20
27
|
task default: :test
|
21
28
|
|
22
29
|
begin
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.0.
|
1
|
+
1.0.0.2
|
data/lib/schnorr_sig/pure.rb
CHANGED
@@ -5,8 +5,6 @@ autoload :SecureRandom, 'securerandom' # stdlib
|
|
5
5
|
# This implementation is based on the BIP340 spec: https://bips.xyz/340
|
6
6
|
module SchnorrSig
|
7
7
|
class SanityCheck < Error; end
|
8
|
-
class VerifyFail < Error; end
|
9
|
-
class InfinityPoint < Error; end
|
10
8
|
|
11
9
|
GROUP = ECDSA::Group::Secp256k1
|
12
10
|
P = GROUP.field.prime # smaller than 256**32
|
@@ -48,7 +46,7 @@ module SchnorrSig
|
|
48
46
|
when ECDSA::Point
|
49
47
|
# BIP340: The function bytes(P), where P is a point,
|
50
48
|
# returns bytes(x(P)).
|
51
|
-
val.infinity? ? raise(
|
49
|
+
val.infinity? ? raise(SanityCheck, val.inspect) : big2bin(val.x)
|
52
50
|
else
|
53
51
|
raise(SanityCheck, val.inspect)
|
54
52
|
end
|
@@ -177,7 +175,7 @@ module SchnorrSig
|
|
177
175
|
# BIP340: Fail unless Verify(bytes(P), m, sig)
|
178
176
|
# BIP340: Return the signature sig
|
179
177
|
sig = bytes_r + bytes((k + e * d) % N)
|
180
|
-
raise(
|
178
|
+
raise(SanityCheck, "sig did not verify") unless verify?(bytes_p, m, sig)
|
181
179
|
sig
|
182
180
|
end
|
183
181
|
|
@@ -219,7 +217,7 @@ module SchnorrSig
|
|
219
217
|
def soft_verify?(pk, m, sig)
|
220
218
|
begin
|
221
219
|
verify?(pk, m, sig)
|
222
|
-
rescue SanityCheck
|
220
|
+
rescue SanityCheck
|
223
221
|
false
|
224
222
|
end
|
225
223
|
end
|
data/lib/schnorr_sig/utils.rb
CHANGED
@@ -1,21 +1,23 @@
|
|
1
1
|
module SchnorrSig
|
2
2
|
class Error < RuntimeError; end
|
3
|
-
class
|
3
|
+
class SpecError < Error; end
|
4
4
|
|
5
5
|
KEY = 32 # bytes
|
6
6
|
SIG = 64 # bytes
|
7
7
|
|
8
8
|
module Utils
|
9
|
-
# raise
|
9
|
+
# raise SpecError or return val
|
10
10
|
def check!(val, cls)
|
11
|
-
val.is_a?(cls) ? val : raise(
|
11
|
+
val.is_a?(cls) ? val : raise(SpecError, "#{cls}: #{val.inspect}")
|
12
12
|
end
|
13
13
|
|
14
|
-
# raise
|
14
|
+
# raise SpecError or return str
|
15
15
|
def binary!(str, length)
|
16
16
|
check!(str, String)
|
17
|
-
|
18
|
-
|
17
|
+
if str.encoding != Encoding::BINARY
|
18
|
+
raise(SpecError, "Encoding: #{str.encoding}")
|
19
|
+
end
|
20
|
+
raise(SpecError, "Length: #{str.length}") if str.length != length
|
19
21
|
str
|
20
22
|
end
|
21
23
|
|
data/schnorr_sig.gemspec
CHANGED
data/sig/fast.rbs
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module SchnorrSig
|
2
|
+
CONTEXT: Secp256k1::Context
|
3
|
+
|
4
|
+
module Fast
|
5
|
+
def keypair_obj: (?String sk) -> Secp256k1::KeyPair
|
6
|
+
def extract_keys: (Secp256k1::KeyPair keypair_obj) -> [String, String]
|
7
|
+
def pubkey: (String sk) -> String
|
8
|
+
def keypair: -> [String, String]
|
9
|
+
def signature: (String str) -> Secp256k1::SchnorrSignature
|
10
|
+
def sign: (String sk, String m) -> String
|
11
|
+
def verify?: (String pk, String m, String sig) -> bool
|
12
|
+
def soft_verify?: (String pk, String m, String sig) -> bool
|
13
|
+
def tagged_hash: (String tag, String msg) -> String
|
14
|
+
end
|
15
|
+
end
|
data/sig/pure.rbs
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module SchnorrSig
|
2
|
+
class SanityCheck < Error
|
3
|
+
end
|
4
|
+
|
5
|
+
GROUP: ECDSA::Group::Secp256k1
|
6
|
+
P: Integer
|
7
|
+
N: Integer
|
8
|
+
B: Integer
|
9
|
+
|
10
|
+
module Pure
|
11
|
+
def random_bytes: (Integer count) -> String
|
12
|
+
def point: (Integer int) -> ECDSA::Point
|
13
|
+
def select_even_y: (ECDSA::Point point, Integer even_val) -> Integer
|
14
|
+
def int: (String x) -> Integer
|
15
|
+
def bytes: (Integer | ECDSA::Point val) -> String
|
16
|
+
def lift_x: (Integer x) -> ECDSA::Point
|
17
|
+
def tagged_hash: (String tag, String msg) -> String
|
18
|
+
def pubkey: (String sk) -> String
|
19
|
+
def keypair: -> [String, String]
|
20
|
+
def sign: (String sk, String m, ?auxrand: String?) -> String
|
21
|
+
def verify?: (String pk, String m, String sig) -> bool
|
22
|
+
def soft_verify?: (String pk, String m, String sig) -> bool
|
23
|
+
end
|
24
|
+
end
|
data/sig/utils.rbs
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module SchnorrSig
|
2
|
+
class Error < RuntimeError
|
3
|
+
end
|
4
|
+
class SpecError < Error
|
5
|
+
end
|
6
|
+
|
7
|
+
KEY: 32
|
8
|
+
SIG: 64
|
9
|
+
|
10
|
+
module Utils
|
11
|
+
def check!: (untyped val, Class cls) -> untyped
|
12
|
+
def binary!: (String str, Integer length) -> String
|
13
|
+
def bin2big: (String str) -> Integer
|
14
|
+
def big2bin: (Integer bignum) -> String
|
15
|
+
def bin2hex: (String str) -> String
|
16
|
+
def hex2bin: (String hex) -> String
|
17
|
+
end
|
18
|
+
end
|
data/test/utils.rb
CHANGED
@@ -10,17 +10,17 @@ describe Utils do
|
|
10
10
|
it "enforces the class of any object" do
|
11
11
|
expect(Utils.check!('123', String)).must_equal '123'
|
12
12
|
expect(Utils.check!(123, Integer)).must_equal 123
|
13
|
-
expect { Utils.check!([], String) }.must_raise
|
13
|
+
expect { Utils.check!([], String) }.must_raise SpecError
|
14
14
|
end
|
15
15
|
|
16
16
|
it "enforces binary strings: type, encoding, length" do
|
17
17
|
expect(Utils.binary!("\x00\x01".b, 2)).must_equal "\x00\x01".b
|
18
18
|
expect {
|
19
19
|
Utils.binary!("\x00\x01".b, 3)
|
20
|
-
}.must_raise
|
20
|
+
}.must_raise SpecError
|
21
21
|
expect {
|
22
22
|
Utils.binary!("\x00\x01", 2)
|
23
|
-
}.must_raise
|
23
|
+
}.must_raise SpecError
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
data/test/vectors.rb
CHANGED
@@ -18,7 +18,7 @@ table.each { |row|
|
|
18
18
|
|
19
19
|
result = begin
|
20
20
|
SchnorrSig.soft_verify?(pk, m, sig)
|
21
|
-
rescue SchnorrSig::
|
21
|
+
rescue SchnorrSig::SpecError
|
22
22
|
skip << row
|
23
23
|
next
|
24
24
|
end
|
@@ -37,4 +37,3 @@ puts "Failure: #{failure.count}"
|
|
37
37
|
puts "Skipped: #{skip.count}"
|
38
38
|
|
39
39
|
failure.each { |row| p row }
|
40
|
-
exit failure.count
|
data/test/vectors_extra.rb
CHANGED
@@ -31,18 +31,22 @@ table.each { |row|
|
|
31
31
|
# calculate a signature
|
32
32
|
begin
|
33
33
|
calc_sig = SchnorrSig.sign(sk, m)
|
34
|
-
|
35
|
-
|
34
|
+
sig_msg = (calc_sig == sig) ? "sig match" : "sig mismatch"
|
35
|
+
rescue SchnorrSig::SpecError
|
36
|
+
sig_msg = "sig error"
|
36
37
|
end
|
37
|
-
sig_msg = (calc_sig == sig) ? "sig match" : "sig mismatch"
|
38
38
|
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
if sig_msg != "sig error"
|
41
|
+
begin
|
42
|
+
result = SchnorrSig.soft_verify?(pk, m, sig)
|
43
|
+
verify_msg = (result == expected) ? "verify match" : "verify mismatch"
|
44
|
+
rescue SchnorrSig::SpecError
|
45
|
+
verify_msg = "verify error"
|
46
|
+
end
|
47
|
+
else
|
48
|
+
verify_msg = "sig error"
|
44
49
|
end
|
45
|
-
verify_msg = (result == expected) ? "verify match" : "verify mismatch"
|
46
50
|
puts [index, pk_msg, sig_msg, verify_msg, comment].join("\t")
|
47
51
|
}
|
48
52
|
puts
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schnorr_sig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rick Hull
|
@@ -38,6 +38,9 @@ files:
|
|
38
38
|
- lib/schnorr_sig/pure.rb
|
39
39
|
- lib/schnorr_sig/utils.rb
|
40
40
|
- schnorr_sig.gemspec
|
41
|
+
- sig/fast.rbs
|
42
|
+
- sig/pure.rbs
|
43
|
+
- sig/utils.rbs
|
41
44
|
- test/fast.rb
|
42
45
|
- test/pure.rb
|
43
46
|
- test/utils.rb
|