noise-ruby 0.8.4 → 0.9.4

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: 9016d0344507e501e7a92acab0142a15b1d472303e6dfd92ff5bd0a89e135d34
4
- data.tar.gz: 68cc424b0c8e91006df86737fca0d0f7d5ea723a02ac8335a65ad0e7e746ffd9
3
+ metadata.gz: eb6e8b4da6da1ab86d95f9712cc5af2fde45c8fb2c6b53f8f76cd4e585c8b509
4
+ data.tar.gz: 7bbec8a8af754911c1b9ce7026ee21ac98b6af601a40c503e4d4fd03a4679e5a
5
5
  SHA512:
6
- metadata.gz: 2c6c80f4b7c4bbafe3ff40788639c8b03bac62bcc75646ce13de59960abafd1fbc0beb68903eb8ca0120853afc46c972cac1428572b52bbb8c9b5019a75af2e9
7
- data.tar.gz: 92b6ad660ee6e22acb87dbcd85925fed0bee616e87b8175d1408dfa26bcb0c8fc146a876fa21237bb74b14cc51759a0ed6da320a758d00f1f51991cc899b7bfa
6
+ metadata.gz: 38130604059543fb695227160b59655cc617a29a70abb4d6cac67636fee53b9c7ae78264b6123928842ce1a67ad10a634b7b438d4ec54cf23e48a4e3398aab37
7
+ data.tar.gz: 0124a47916e35d8267b39336327fc3f496a25068090f6886f92c4a4edf7e4479bb968cd2d78401003821703143bf936aadabd38580146819ab945df981cd0ce1
@@ -21,3 +21,6 @@ Style/WordArray:
21
21
 
22
22
  AllCops:
23
23
  TargetRubyVersion: 2.4.1
24
+
25
+ Naming/UncommunicativeMethodParamName:
26
+ MinNameLength: 1
data/README.md CHANGED
@@ -9,15 +9,11 @@ This is required for Lightning Network, layer-2 protocol for bitcoin.
9
9
 
10
10
  see https://github.com/lightningnetwork/lightning-rfc/blob/master/08-transport.md
11
11
 
12
- ## Future Works
13
-
14
- The followings are not supported yet.
15
-
16
- - DH Functions
17
- - Curve448
18
-
19
12
  ## Installation
20
13
 
14
+ This gem needs libsodium and libgoldilocks library.
15
+ To install these library, see https://github.com/jedisct1/libsodium and https://github.com/otrv4/libgoldilocks
16
+
21
17
  Add this line to your application's Gemfile:
22
18
 
23
19
  ```
@@ -55,6 +55,7 @@ module Noise
55
55
  raise Noise::Exceptions::NoiseHandshakeError unless @handshake_started
56
56
  raise Noise::Exceptions::NoiseHandshakeError if @next_message != :write
57
57
  raise Noise::Exceptions::NoiseHandshakeError if @handshake_finished
58
+
58
59
  @next_message = :read
59
60
  buffer = +''
60
61
  result = @handshake_state.write_message(payload, buffer)
@@ -77,11 +78,13 @@ module Noise
77
78
 
78
79
  def encrypt(data)
79
80
  raise Noise::Exceptions::NoiseHandshakeError unless @handshake_finished
81
+
80
82
  @cipher_state_encrypt.encrypt_with_ad('', data)
81
83
  end
82
84
 
83
85
  def decrypt(data)
84
86
  raise Noise::Exceptions::NoiseHandshakeError unless @handshake_finished
87
+
85
88
  @cipher_state_decrypt.decrypt_with_ad('', data)
86
89
  end
87
90
 
@@ -100,6 +103,7 @@ module Noise
100
103
  validate_psk! if psk_handshake?
101
104
 
102
105
  raise Noise::Exceptions::NoiseValidationError if valid_keypairs?
106
+
103
107
  true
104
108
  end
105
109
 
@@ -12,6 +12,8 @@ module Noise
12
12
  cipher.iv = nonce_to_bytes(n)
13
13
  cipher.auth_data = ad
14
14
  cipher.update(plaintext) + cipher.final + cipher.auth_tag
15
+ rescue OpenSSL::Cipher::CipherError => e
16
+ raise Noise::Exceptions::EncryptError.new(e)
15
17
  end
16
18
 
17
19
  def decrypt(k, n, ad, ciphertext)
@@ -21,6 +23,8 @@ module Noise
21
23
  cipher.auth_data = ad
22
24
  cipher.auth_tag = ciphertext[-16..-1]
23
25
  cipher.update(ciphertext[0...-16]) + cipher.final
26
+ rescue OpenSSL::Cipher::CipherError => e
27
+ raise Noise::Exceptions::DecryptError.new(e)
24
28
  end
25
29
 
26
30
  def nonce_to_bytes(n)
@@ -10,14 +10,14 @@ module Noise
10
10
  cipher = RbNaCl::AEAD::ChaCha20Poly1305IETF.new(String.new(k).force_encoding('ASCII-8BIT'))
11
11
  cipher.encrypt(nonce_to_bytes(n), plaintext, ad)
12
12
  rescue ::RbNaCl::CryptoError => e
13
- raise Noise::Exceptions::EncryptError, e
13
+ raise Noise::Exceptions::EncryptError.new(e)
14
14
  end
15
15
 
16
16
  def decrypt(k, n, ad, ciphertext)
17
17
  cipher = RbNaCl::AEAD::ChaCha20Poly1305IETF.new(String.new(k).force_encoding('ASCII-8BIT'))
18
18
  cipher.decrypt(nonce_to_bytes(n), ciphertext, ad)
19
19
  rescue ::RbNaCl::CryptoError => e
20
- raise Noise::Exceptions::DecryptError, e
20
+ raise Noise::Exceptions::DecryptError.new(e)
21
21
  end
22
22
 
23
23
  def nonce_to_bytes(n)
@@ -1,21 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ begin
4
+ require 'ed448'
5
+ Ed448.init
6
+ rescue LoadError
7
+ end
8
+
3
9
  module Noise
4
10
  module Functions
5
11
  module DH
6
12
  class ED448
7
- DHLEN = 56
13
+ DHLEN = Ed448::X448::X448_PRIVATE_BYTES
14
+
8
15
  def generate_keypair
9
- throw NotImplementedError
16
+ private_key = SecureRandom.random_bytes(DHLEN)
17
+ public_key = Ed448::X448.derive_public_key(private_key)
18
+ Noise::Key.new(private_key, public_key)
10
19
  end
11
20
 
12
- def dh(_key_pair, _public_key)
13
- throw NotImplementedError
21
+ def dh(private_key, public_key)
22
+ Ed448::X448.dh(public_key, private_key)
14
23
  end
15
24
 
16
25
  def dhlen
17
26
  DHLEN
18
27
  end
28
+
29
+ def self.from_private(private_key)
30
+ public_key = Ed448::X448.derive_public_key(private_key)
31
+ Noise::Key.new(private_key, public_key)
32
+ end
19
33
  end
20
34
  end
21
35
  end
@@ -46,8 +46,8 @@ module Noise
46
46
  # Sets message_patterns to the message patterns from handshake_pattern
47
47
  @message_patterns = @protocol.pattern.tokens.dup
48
48
 
49
- @protocol.pattern.initiator_pre_messages&.map do |message|
50
- keypair = initiator_keypair_getter.call(message)
49
+ @protocol.pattern.initiator_pre_messages&.map do |token|
50
+ keypair = initiator_keypair_getter.call(token)
51
51
  @symmetric_state.mix_hash(keypair)
52
52
  end
53
53
 
@@ -57,8 +57,8 @@ module Noise
57
57
  @symmetric_state.mix_hash(public_key)
58
58
  end
59
59
 
60
- @protocol.pattern.responder_pre_messages&.map do |message|
61
- keypair = responder_keypair_getter.call(message)
60
+ @protocol.pattern.responder_pre_messages&.map do |token|
61
+ keypair = responder_keypair_getter.call(token)
62
62
  @symmetric_state.mix_hash(keypair)
63
63
  end
64
64
  end
@@ -66,18 +66,18 @@ module Noise
66
66
  def expected_message_length(payload_size)
67
67
  has_key = @symmetric_state.cipher_state.key?
68
68
  pattern = @message_patterns.first
69
- len = pattern.inject(0) do |len, token|
69
+ len = pattern.inject(0) do |l, token|
70
70
  case token
71
71
  when 'e'
72
- len += @protocol.dh_fn.dhlen
72
+ l += @protocol.dh_fn.dhlen
73
73
  has_key = true if @protocol.psk_handshake?
74
74
  when 's'
75
- len += @protocol.dh_fn.dhlen
76
- len += 16 if has_key
75
+ l += @protocol.dh_fn.dhlen
76
+ l += 16 if has_key
77
77
  when 'ee', 'es', 'se', 'ss', 'psk'
78
78
  has_key = true
79
79
  end
80
- len
80
+ l
81
81
  end
82
82
  len += payload_size
83
83
  len += 16 if has_key
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Noise
4
- VERSION = '0.8.4'
4
+ VERSION = '0.9.4'
5
5
  end
@@ -29,4 +29,5 @@ Gem::Specification.new do |spec|
29
29
  spec.add_runtime_dependency 'ecdsa'
30
30
  spec.add_runtime_dependency 'rbnacl'
31
31
  spec.add_runtime_dependency 'ruby-hmac'
32
+ spec.add_runtime_dependency 'ed448'
32
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noise-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hajime Yamaguchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-24 00:00:00.000000000 Z
11
+ date: 2019-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: ed448
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  description: A Ruby implementation of the Noise Protocol framework(http://noiseprotocol.org/).
112
126
  email:
113
127
  - gen.yamaguchi0@gmail.com