bip-schnorr 0.7.0 → 0.7.1
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/.github/workflows/ruby.yml +5 -4
- data/.ruby-version +1 -1
- data/Gemfile +2 -0
- data/bip-schnorrrb.gemspec +1 -1
- data/lib/schnorr/musig2/context/session.rb +3 -3
- data/lib/schnorr/musig2.rb +5 -5
- data/lib/schnorr/util.rb +12 -0
- data/lib/schnorr/version.rb +1 -1
- data/lib/schnorr.rb +2 -3
- metadata +5 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d448f075885c68f9c74b1627d328180ee271392781bd1b8f9850ec6fd9e2ee53
|
|
4
|
+
data.tar.gz: 633ddb345ba97a474205bf7d42953cffc4d2fae42f23aae2454cfdde57ba2c55
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 33b5ae79ea9aa07a76e532e7095d5f82b6dae8002610bdf19da74410f46240a2c06c2615cacf33a720f9b2ac5ec68fbf0837ed33e3f5e729fe0d474a83b82946
|
|
7
|
+
data.tar.gz: da1643275dbaf585d58add1265614be32496d7e4edeb70a7513be2290d30834f47f5f97f1044fa747b8f72ac35603595022c02914b82fd01fea265c669e5e98e
|
data/.github/workflows/ruby.yml
CHANGED
|
@@ -20,11 +20,12 @@ jobs:
|
|
|
20
20
|
strategy:
|
|
21
21
|
matrix:
|
|
22
22
|
ruby:
|
|
23
|
-
- '3.
|
|
24
|
-
- '3.
|
|
25
|
-
- '3.
|
|
23
|
+
- '3.2'
|
|
24
|
+
- '3.3'
|
|
25
|
+
- '3.4'
|
|
26
|
+
- '4.0'
|
|
26
27
|
steps:
|
|
27
|
-
- uses: actions/checkout@
|
|
28
|
+
- uses: actions/checkout@v4
|
|
28
29
|
- name: Set up Ruby
|
|
29
30
|
uses: ruby/setup-ruby@v1
|
|
30
31
|
with:
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
ruby-
|
|
1
|
+
ruby-4.0.0
|
data/Gemfile
CHANGED
data/bip-schnorrrb.gemspec
CHANGED
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
|
20
20
|
spec.bindir = "exe"
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
22
22
|
spec.require_paths = ["lib"]
|
|
23
|
-
spec.add_runtime_dependency "ecdsa_ext", "~> 0.5.
|
|
23
|
+
spec.add_runtime_dependency "ecdsa_ext", "~> 0.5.2"
|
|
24
24
|
|
|
25
25
|
spec.add_development_dependency "bundler"
|
|
26
26
|
spec.add_development_dependency "rake", ">= 12.3.3"
|
|
@@ -57,14 +57,14 @@ module Schnorr
|
|
|
57
57
|
k2 = r.has_even_y? ? k2 : GROUP.order - k2
|
|
58
58
|
d = sk.bti
|
|
59
59
|
raise ArgumentError, 'secret key value is out of range.' if d <= 0 || GROUP.order <= d
|
|
60
|
-
p = (GROUP.generator.to_jacobian * d).to_affine.encode
|
|
60
|
+
p = (GROUP.generator.to_jacobian * pad_scalar(d)).to_affine.encode
|
|
61
61
|
raise ArgumentError, 'Public key does not match nonce_gen argument' unless p == nonce[64...97]
|
|
62
62
|
a = key_agg_coeff(pubkeys, p)
|
|
63
63
|
g = agg_ctx.q.has_even_y? ? 1 : GROUP.order - 1
|
|
64
64
|
d = (g * agg_ctx.gacc * d) % GROUP.order
|
|
65
65
|
s = (k1 + b * k2 + e * a * d) % GROUP.order
|
|
66
|
-
r1 = (GROUP.generator.to_jacobian * k1).to_affine
|
|
67
|
-
r2 = (GROUP.generator.to_jacobian * k2).to_affine
|
|
66
|
+
r1 = (GROUP.generator.to_jacobian * pad_scalar(k1)).to_affine
|
|
67
|
+
r2 = (GROUP.generator.to_jacobian * pad_scalar(k2)).to_affine
|
|
68
68
|
raise ArgumentError, 'R1 can not be infinity.' if r1.infinity?
|
|
69
69
|
raise ArgumentError, 'R2 can not be infinity.' if r2.infinity?
|
|
70
70
|
used_secnonces << nonce
|
data/lib/schnorr/musig2.rb
CHANGED
|
@@ -101,8 +101,8 @@ module Schnorr
|
|
|
101
101
|
raise ArgumentError, 'k1 must not be zero.' if k1_i.zero?
|
|
102
102
|
raise ArgumentError, 'k2 must not be zero.' if k2_i.zero?
|
|
103
103
|
|
|
104
|
-
r1 = (GROUP.generator.to_jacobian * k1_i).to_affine
|
|
105
|
-
r2 = (GROUP.generator.to_jacobian * k2_i).to_affine
|
|
104
|
+
r1 = (GROUP.generator.to_jacobian * pad_scalar(k1_i)).to_affine
|
|
105
|
+
r2 = (GROUP.generator.to_jacobian * pad_scalar(k2_i)).to_affine
|
|
106
106
|
pub_nonce = r1.encode + r2.encode
|
|
107
107
|
sec_nonce = k1 + k2 + pk
|
|
108
108
|
[sec_nonce.unpack1('H*'), pub_nonce.unpack1('H*')]
|
|
@@ -148,12 +148,12 @@ module Schnorr
|
|
|
148
148
|
agg_pk = [agg_ctx.x_only_pubkey].pack("H*")
|
|
149
149
|
k1 = deterministic_nonce_hash(sk_, agg_other_nonce, agg_pk, msg, 0).bti
|
|
150
150
|
k2 = deterministic_nonce_hash(sk_, agg_other_nonce, agg_pk, msg, 1).bti
|
|
151
|
-
r1 = (GROUP.generator.to_jacobian * k1).to_affine
|
|
152
|
-
r2 = (GROUP.generator.to_jacobian * k2).to_affine
|
|
151
|
+
r1 = (GROUP.generator.to_jacobian * pad_scalar(k1)).to_affine
|
|
152
|
+
r2 = (GROUP.generator.to_jacobian * pad_scalar(k2)).to_affine
|
|
153
153
|
raise ArgumentError, 'R1 must not be infinity.' if r1.infinity?
|
|
154
154
|
raise ArgumentError, 'R2 must not be infinity.' if r2.infinity?
|
|
155
155
|
pub_nonce = r1.encode + r2.encode
|
|
156
|
-
pk = (GROUP.generator.to_jacobian * sk.bti).to_affine
|
|
156
|
+
pk = (GROUP.generator.to_jacobian * pad_scalar(sk.bti)).to_affine
|
|
157
157
|
sec_nonce = ECDSA::Format::IntegerOctetString.encode(k1, GROUP.byte_length) +
|
|
158
158
|
ECDSA::Format::IntegerOctetString.encode(k2, GROUP.byte_length) + pk.encode
|
|
159
159
|
agg_nonce = aggregate_nonce([pub_nonce, agg_other_nonce])
|
data/lib/schnorr/util.rb
CHANGED
|
@@ -24,5 +24,17 @@ module Schnorr
|
|
|
24
24
|
def string2point(str)
|
|
25
25
|
ECDSA::Format::PointOctetString.decode(str, GROUP)
|
|
26
26
|
end
|
|
27
|
+
|
|
28
|
+
# Pad +scalar+ with the group order so that its bit length is fixed,
|
|
29
|
+
# mitigating a timing leak of the bit length of a secret scalar.
|
|
30
|
+
# Since (k + i * n)G = kG, this does not change the resulting point.
|
|
31
|
+
# Only use this for secret scalars; padding a public scalar just costs an extra doubling.
|
|
32
|
+
# @param [Integer] scalar A secret scalar.
|
|
33
|
+
# @return [Integer] The padded scalar.
|
|
34
|
+
def pad_scalar(scalar)
|
|
35
|
+
k = scalar + GROUP.order
|
|
36
|
+
k += GROUP.order if k.bit_length == GROUP.order.bit_length
|
|
37
|
+
k
|
|
38
|
+
end
|
|
27
39
|
end
|
|
28
40
|
end
|
data/lib/schnorr/version.rb
CHANGED
data/lib/schnorr.rb
CHANGED
|
@@ -31,7 +31,7 @@ module Schnorr
|
|
|
31
31
|
aux_rand = DEFAULT_AUX
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
p = (GROUP.generator.to_jacobian * d0).to_affine
|
|
34
|
+
p = (GROUP.generator.to_jacobian * pad_scalar(d0)).to_affine
|
|
35
35
|
d = p.has_even_y? ? d0 : GROUP.order - d0
|
|
36
36
|
|
|
37
37
|
t = aux_rand.nil? ? d : d ^ tagged_hash('BIP0340/aux', aux_rand).bti
|
|
@@ -40,7 +40,7 @@ module Schnorr
|
|
|
40
40
|
k0 = ECDSA::Format::IntegerOctetString.decode(tagged_hash('BIP0340/nonce', t + p.encode(true) + message)) % GROUP.order
|
|
41
41
|
raise 'Creation of signature failed. k is zero' if k0.zero?
|
|
42
42
|
|
|
43
|
-
r = (GROUP.generator.to_jacobian * k0).to_affine
|
|
43
|
+
r = (GROUP.generator.to_jacobian * pad_scalar(k0)).to_affine
|
|
44
44
|
k = r.has_even_y? ? k0 : GROUP.order - k0
|
|
45
45
|
e = create_challenge(r.x, p, message)
|
|
46
46
|
|
|
@@ -69,7 +69,6 @@ module Schnorr
|
|
|
69
69
|
def check_sig!(message, public_key, signature)
|
|
70
70
|
message = hex2bin(message)
|
|
71
71
|
public_key = hex2bin(public_key)
|
|
72
|
-
public_key = [public_key].pack('H*') if hex_string?(public_key)
|
|
73
72
|
raise InvalidSignatureError, 'The public key must be a 32-byte array.' unless public_key.bytesize == 32
|
|
74
73
|
|
|
75
74
|
sig = Schnorr::Signature.decode(signature)
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bip-schnorr
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.7.
|
|
4
|
+
version: 0.7.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- azuchi
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: ecdsa_ext
|
|
@@ -16,14 +15,14 @@ dependencies:
|
|
|
16
15
|
requirements:
|
|
17
16
|
- - "~>"
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.5.
|
|
18
|
+
version: 0.5.2
|
|
20
19
|
type: :runtime
|
|
21
20
|
prerelease: false
|
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
22
|
requirements:
|
|
24
23
|
- - "~>"
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0.5.
|
|
25
|
+
version: 0.5.2
|
|
27
26
|
- !ruby/object:Gem::Dependency
|
|
28
27
|
name: bundler
|
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -98,7 +97,6 @@ homepage: https://github.com/chaintope/bip-schnorrrb
|
|
|
98
97
|
licenses:
|
|
99
98
|
- MIT
|
|
100
99
|
metadata: {}
|
|
101
|
-
post_install_message:
|
|
102
100
|
rdoc_options: []
|
|
103
101
|
require_paths:
|
|
104
102
|
- lib
|
|
@@ -113,8 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
113
111
|
- !ruby/object:Gem::Version
|
|
114
112
|
version: '0'
|
|
115
113
|
requirements: []
|
|
116
|
-
rubygems_version: 3.
|
|
117
|
-
signing_key:
|
|
114
|
+
rubygems_version: 3.6.9
|
|
118
115
|
specification_version: 4
|
|
119
116
|
summary: The ruby implementation of bip-schnorr.
|
|
120
117
|
test_files: []
|