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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62086f5dc865721a602e4ac25f1c58920eba47d0e7bb5ab59d389af297095750
4
- data.tar.gz: 3e6ddfbc75956f04e84f01412b034974cb592ef1adea72775acdc949946d2ebf
3
+ metadata.gz: d448f075885c68f9c74b1627d328180ee271392781bd1b8f9850ec6fd9e2ee53
4
+ data.tar.gz: 633ddb345ba97a474205bf7d42953cffc4d2fae42f23aae2454cfdde57ba2c55
5
5
  SHA512:
6
- metadata.gz: 4f599b83ba35a76df8425eb7eb436740f690ec011dcfc6eac65af1591bb748d1421dd71d2cf15c480e44302bd821ffda6f385799549a37f2a8159a592c510482
7
- data.tar.gz: f7cb59f75a709bb05509697a55bd3864944a82d4a9768bc34db84da0b6a215b9060fa875722ebb597731f3df6a4155e738b419c413b5ef06278378f2b3055627
6
+ metadata.gz: 33b5ae79ea9aa07a76e532e7095d5f82b6dae8002610bdf19da74410f46240a2c06c2615cacf33a720f9b2ac5ec68fbf0837ed33e3f5e729fe0d474a83b82946
7
+ data.tar.gz: da1643275dbaf585d58add1265614be32496d7e4edeb70a7513be2290d30834f47f5f97f1044fa747b8f72ac35603595022c02914b82fd01fea265c669e5e98e
@@ -20,11 +20,12 @@ jobs:
20
20
  strategy:
21
21
  matrix:
22
22
  ruby:
23
- - '3.0.6'
24
- - '3.1.4'
25
- - '3.2.2'
23
+ - '3.2'
24
+ - '3.3'
25
+ - '3.4'
26
+ - '4.0'
26
27
  steps:
27
- - uses: actions/checkout@v2
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-3.2.0
1
+ ruby-4.0.0
data/Gemfile CHANGED
@@ -4,3 +4,5 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in bip-schnorrrb.gemspec
6
6
  gemspec
7
+
8
+ gem 'csv'
@@ -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.0"
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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Schnorr
2
- VERSION = "0.7.0"
2
+ VERSION = "0.7.1"
3
3
  end
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.0
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: 2023-12-22 00:00:00.000000000 Z
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.0
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.0
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.4.1
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: []