noise-ruby 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -1
- data/lib/noise/connection.rb +6 -2
- data/lib/noise/exceptions.rb +2 -0
- data/lib/noise/exceptions/noise_psk_error.rb +8 -0
- data/lib/noise/exceptions/psk_value_error.rb +8 -0
- data/lib/noise/functions/dh.rb +2 -2
- data/lib/noise/functions/dh/ed25519.rb +34 -0
- data/lib/noise/functions/dh/{dh448.rb → ed448.rb} +1 -1
- data/lib/noise/functions/dh/secp256k1.rb +17 -3
- data/lib/noise/pattern.rb +65 -36
- data/lib/noise/protocol.rb +26 -13
- data/lib/noise/state/handshake_state.rb +8 -0
- data/lib/noise/version.rb +1 -1
- data/noise.gemspec +2 -0
- metadata +6 -4
- data/lib/noise/functions/dh/dh25519.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b311addeddc717377b96beaecbe50300759ea5d6
|
4
|
+
data.tar.gz: 2979832b1b009280a5998de859bead7cae613b00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 176002bdc3b0763255c0c2679485e38aa9d9795477dd7d789f40cebaa2154ae877fcec6593ab0409f095447cfd49f565aac8216053742bc3dce3572fc9a67253
|
7
|
+
data.tar.gz: ac57838f8ab1e3a0f8910dae97cb8d28a8b9a83bec9b6e433316c062c1f2c09465c149ace734db23d0da6360bb5c1f12545f3ad858f72a87cca045ae89554ad9
|
data/README.md
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
A Ruby implementation of the Noise Protocol framework(http://noiseprotocol.org/).
|
4
4
|
|
5
|
+
## Secp256k1
|
6
|
+
|
7
|
+
Secp256k1 cipher function is supported.
|
8
|
+
This is required for Lightning Network, layer-2 protocol for bitcoin.
|
9
|
+
see
|
10
|
+
|
5
11
|
## Future Works
|
6
12
|
|
7
13
|
The followings are not supported yet.
|
@@ -10,7 +16,6 @@ The followings are not supported yet.
|
|
10
16
|
- Curve448
|
11
17
|
- Hash Functions
|
12
18
|
- Blake2s
|
13
|
-
- PSK Mode
|
14
19
|
|
15
20
|
## Installation
|
16
21
|
|
data/lib/noise/connection.rb
CHANGED
@@ -22,8 +22,12 @@ module Noise
|
|
22
22
|
@handshake_started = false
|
23
23
|
@handshake_finished = false
|
24
24
|
@fn = nil
|
25
|
-
@write_message_proc =
|
26
|
-
@read_message_proc =
|
25
|
+
@write_message_proc = lambda {|payload| write_message(payload)}
|
26
|
+
@read_message_proc = lambda {|payload| read_message(payload)}
|
27
|
+
end
|
28
|
+
|
29
|
+
def psks=(psks)
|
30
|
+
@protocol.psks = psks
|
27
31
|
end
|
28
32
|
|
29
33
|
def prologue=(prologue)
|
data/lib/noise/exceptions.rb
CHANGED
@@ -6,5 +6,7 @@ module Noise
|
|
6
6
|
autoload :ProtocolNameError, 'noise/exceptions/protocol_name_error'
|
7
7
|
autoload :NoiseHandshakeError, 'noise/exceptions/noise_handshake_error'
|
8
8
|
autoload :NoiseValidationError, 'noise/exceptions/noise_validation_error'
|
9
|
+
autoload :NoisePSKError, 'noise/exceptions/noise_psk_error'
|
10
|
+
autoload :PSKValueError, 'noise/exceptions/psk_value_error'
|
9
11
|
end
|
10
12
|
end
|
data/lib/noise/functions/dh.rb
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
module Noise
|
4
4
|
module Functions
|
5
5
|
module DH
|
6
|
-
autoload :
|
7
|
-
autoload :
|
6
|
+
autoload :ED448, 'noise/functions/dh/ed448'
|
7
|
+
autoload :ED25519, 'noise/functions/dh/ed25519'
|
8
8
|
autoload :Secp256k1, 'noise/functions/dh/secp256k1'
|
9
9
|
end
|
10
10
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Noise
|
4
|
+
module Functions
|
5
|
+
module DH
|
6
|
+
class ED25519
|
7
|
+
DHLEN = 32
|
8
|
+
def generate_keypair
|
9
|
+
private_key = 1 + SecureRandom.random_number(RbNaCl::GroupElement::STANDARD_GROUP_ORDER - 1)
|
10
|
+
scalar_as_string = ECDSA::Format::IntegerOctetString.encode(private_key, 32)
|
11
|
+
public_key = RbNaCl::GroupElements::Curve25519.base.mult(scalar_as_string)
|
12
|
+
[ECDSA::Format::IntegerOctetString.encode(private_key, 32), public_key.to_bytes]
|
13
|
+
end
|
14
|
+
|
15
|
+
def dh(private_key, public_key)
|
16
|
+
RbNaCl::GroupElement.new(public_key).mult(private_key).to_bytes
|
17
|
+
end
|
18
|
+
|
19
|
+
def dhlen
|
20
|
+
DHLEN
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.from_private(private_key)
|
24
|
+
public_key = RbNaCl::GroupElements::Curve25519.base.mult(private_key)
|
25
|
+
[private_key, public_key.to_bytes]
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.from_public(public_key)
|
29
|
+
[nil, public_key]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -8,19 +8,33 @@ module Noise
|
|
8
8
|
group = ECDSA::Group::Secp256k1
|
9
9
|
private_key = 1 + SecureRandom.random_number(group.order - 1)
|
10
10
|
public_key = group.generator.multiply_by_scalar(private_key)
|
11
|
-
[
|
11
|
+
[
|
12
|
+
ECDSA::Format::IntegerOctetString.encode(private_key, 32),
|
13
|
+
ECDSA::Format::PointOctetString.encode(public_key, compression: true)
|
14
|
+
]
|
12
15
|
end
|
13
16
|
|
14
17
|
def dh(private_key, public_key)
|
15
|
-
|
18
|
+
group = ECDSA::Group::Secp256k1
|
19
|
+
point = ECDSA::Format::PointOctetString.decode(public_key, group)
|
20
|
+
scalar = ECDSA::Format::IntegerOctetString.decode(private_key)
|
21
|
+
point = point.multiply_by_scalar(scalar)
|
22
|
+
ECDSA::Format::PointOctetString.encode(point, compression: true)
|
16
23
|
end
|
17
24
|
|
18
25
|
def dhlen
|
19
26
|
64
|
20
27
|
end
|
28
|
+
|
21
29
|
def self.from_private(private_key)
|
30
|
+
group = ECDSA::Group::Secp256k1
|
31
|
+
scalar = ECDSA::Format::IntegerOctetString.decode(private_key)
|
32
|
+
point = group.generator.multiply_by_scalar(scalar)
|
33
|
+
[private_key, ECDSA::Format::PointOctetString.encode(point, compression: true)]
|
22
34
|
end
|
23
|
-
|
35
|
+
|
36
|
+
def self.from_public(public_key)
|
37
|
+
[nil, public_key]
|
24
38
|
end
|
25
39
|
end
|
26
40
|
end
|
data/lib/noise/pattern.rb
CHANGED
@@ -12,20 +12,49 @@ module Noise
|
|
12
12
|
end
|
13
13
|
|
14
14
|
class Pattern
|
15
|
-
attr_reader :one_way, :tokens
|
15
|
+
attr_reader :one_way, :tokens, :modifiers
|
16
16
|
|
17
17
|
def self.create(name)
|
18
|
-
|
18
|
+
pattern_set = name.scan(/([A-Z]+)([^A-Z]*)/)&.first
|
19
|
+
pattern = pattern_set&.first
|
20
|
+
modifiers = pattern_set[1].split('+')
|
21
|
+
class_name = "Noise::Pattern#{pattern}"
|
19
22
|
klass = Object.const_get(class_name)
|
20
|
-
klass.new
|
23
|
+
klass.new(modifiers)
|
21
24
|
end
|
22
25
|
|
23
|
-
def initialize
|
26
|
+
def initialize(modifiers)
|
24
27
|
@pre_messages = [[], []]
|
25
28
|
@tokens = []
|
26
29
|
@name = ''
|
27
30
|
@one_way = false
|
28
31
|
@psk_count = 0
|
32
|
+
@modifiers = modifiers
|
33
|
+
end
|
34
|
+
|
35
|
+
def apply_pattern_modifiers
|
36
|
+
@modifiers.each do |modifier|
|
37
|
+
if modifier.start_with?('psk')
|
38
|
+
begin
|
39
|
+
index = modifier.gsub(/psk/, '').to_i
|
40
|
+
rescue
|
41
|
+
raise Noise::Exceptions::PSKValueError
|
42
|
+
end
|
43
|
+
# if index * 2 > @tokens.size
|
44
|
+
# raise PSKValueError
|
45
|
+
# end
|
46
|
+
if index == 0
|
47
|
+
@tokens[0].insert(0, Token::PSK)
|
48
|
+
else
|
49
|
+
@tokens[index - 1] << Token::PSK
|
50
|
+
end
|
51
|
+
@psk_count += 1
|
52
|
+
elsif modifier == 'fallback'
|
53
|
+
raise NotImplementedError
|
54
|
+
else
|
55
|
+
raise Noise::Exceptions::PSKValueError
|
56
|
+
end
|
57
|
+
end
|
29
58
|
end
|
30
59
|
|
31
60
|
# initiator [Boolean]
|
@@ -57,15 +86,15 @@ module Noise
|
|
57
86
|
end
|
58
87
|
|
59
88
|
class OneWayPattern < Pattern
|
60
|
-
def initialize
|
61
|
-
super
|
89
|
+
def initialize(modifiers)
|
90
|
+
super(modifiers)
|
62
91
|
@one_way = true
|
63
92
|
end
|
64
93
|
end
|
65
94
|
|
66
95
|
class PatternN < OneWayPattern
|
67
|
-
def initialize
|
68
|
-
super
|
96
|
+
def initialize(modifiers)
|
97
|
+
super(modifiers)
|
69
98
|
@name = 'N'
|
70
99
|
@pre_messages = [[], [Token::S]]
|
71
100
|
@tokens = [[Token::E, Token::ES]]
|
@@ -73,8 +102,8 @@ module Noise
|
|
73
102
|
end
|
74
103
|
|
75
104
|
class PatternK < OneWayPattern
|
76
|
-
def initialize
|
77
|
-
super
|
105
|
+
def initialize(modifiers)
|
106
|
+
super(modifiers)
|
78
107
|
@name = 'K'
|
79
108
|
@pre_messages = [[Token::S], [Token::S]]
|
80
109
|
@tokens = [[Token::E, Token::ES, Token::SS]]
|
@@ -82,8 +111,8 @@ module Noise
|
|
82
111
|
end
|
83
112
|
|
84
113
|
class PatternX < OneWayPattern
|
85
|
-
def initialize
|
86
|
-
super
|
114
|
+
def initialize(modifiers)
|
115
|
+
super(modifiers)
|
87
116
|
@name = 'X'
|
88
117
|
@pre_messages = [[], [Token::S]]
|
89
118
|
@tokens = [[Token::E, Token::ES, Token::S, Token::SS]]
|
@@ -91,8 +120,8 @@ module Noise
|
|
91
120
|
end
|
92
121
|
|
93
122
|
class PatternNN < Pattern
|
94
|
-
def initialize
|
95
|
-
super
|
123
|
+
def initialize(modifiers)
|
124
|
+
super(modifiers)
|
96
125
|
@name = 'NN'
|
97
126
|
@pre_messages = []
|
98
127
|
@tokens = [[Token::E], [Token::E, Token::EE]]
|
@@ -100,8 +129,8 @@ module Noise
|
|
100
129
|
end
|
101
130
|
|
102
131
|
class PatternKN < Pattern
|
103
|
-
def initialize
|
104
|
-
super
|
132
|
+
def initialize(modifiers)
|
133
|
+
super(modifiers)
|
105
134
|
@name = 'KN'
|
106
135
|
@pre_messages = [[Token::S], []]
|
107
136
|
@tokens = [[Token::E], [Token::E, Token::EE, Token::SE]]
|
@@ -109,8 +138,8 @@ module Noise
|
|
109
138
|
end
|
110
139
|
|
111
140
|
class PatternNK < Pattern
|
112
|
-
def initialize
|
113
|
-
super
|
141
|
+
def initialize(modifiers)
|
142
|
+
super(modifiers)
|
114
143
|
@name = 'NK'
|
115
144
|
@pre_messages = [[], [Token::S]]
|
116
145
|
@tokens = [[Token::E, Token::ES], [Token::E, Token::EE]]
|
@@ -118,8 +147,8 @@ module Noise
|
|
118
147
|
end
|
119
148
|
|
120
149
|
class PatternKK < Pattern
|
121
|
-
def initialize
|
122
|
-
super
|
150
|
+
def initialize(modifiers)
|
151
|
+
super(modifiers)
|
123
152
|
@name = 'KK'
|
124
153
|
@pre_messages = [[Token::S], [Token::S]]
|
125
154
|
@tokens = [[Token::E, Token::ES, Token::SS], [Token::E, Token::EE, Token::SE]]
|
@@ -127,16 +156,16 @@ module Noise
|
|
127
156
|
end
|
128
157
|
|
129
158
|
class PatternNX < Pattern
|
130
|
-
def initialize
|
131
|
-
super
|
159
|
+
def initialize(modifiers)
|
160
|
+
super(modifiers)
|
132
161
|
@name = 'NX'
|
133
162
|
@tokens = [[Token::E], [Token::E, Token::EE, Token::S, Token::ES]]
|
134
163
|
end
|
135
164
|
end
|
136
165
|
|
137
166
|
class PatternKX < Pattern
|
138
|
-
def initialize
|
139
|
-
super
|
167
|
+
def initialize(modifiers)
|
168
|
+
super(modifiers)
|
140
169
|
@name = 'KX'
|
141
170
|
@pre_messages = [[Token::S], []]
|
142
171
|
@tokens = [[Token::E], [Token::E, Token::EE, Token::SE, Token::S, Token::ES]]
|
@@ -144,24 +173,24 @@ module Noise
|
|
144
173
|
end
|
145
174
|
|
146
175
|
class PatternXN < Pattern
|
147
|
-
def initialize
|
148
|
-
super
|
176
|
+
def initialize(modifiers)
|
177
|
+
super(modifiers)
|
149
178
|
@name = 'XN'
|
150
179
|
@tokens = [[Token::E], [Token::E, Token::EE], [Token::S, Token::SE]]
|
151
180
|
end
|
152
181
|
end
|
153
182
|
|
154
183
|
class PatternIN < Pattern
|
155
|
-
def initialize
|
156
|
-
super
|
184
|
+
def initialize(modifiers)
|
185
|
+
super(modifiers)
|
157
186
|
@name = 'IN'
|
158
187
|
@tokens = [[Token::E, Token::S], [Token::E, Token::EE, Token::SE]]
|
159
188
|
end
|
160
189
|
end
|
161
190
|
|
162
191
|
class PatternXK < Pattern
|
163
|
-
def initialize
|
164
|
-
super
|
192
|
+
def initialize(modifiers)
|
193
|
+
super(modifiers)
|
165
194
|
@name = 'XK'
|
166
195
|
@pre_messages = [[], [Token::S]]
|
167
196
|
@tokens = [[Token::E, Token::ES], [Token::E, Token::EE], [Token::S, Token::SE]]
|
@@ -169,8 +198,8 @@ module Noise
|
|
169
198
|
end
|
170
199
|
|
171
200
|
class PatternIK < Pattern
|
172
|
-
def initialize
|
173
|
-
super
|
201
|
+
def initialize(modifiers)
|
202
|
+
super(modifiers)
|
174
203
|
@name = 'IK'
|
175
204
|
@pre_messages = [[], [Token::S]]
|
176
205
|
@tokens = [[Token::E, Token::ES, Token::S, Token::SS], [Token::E, Token::EE, Token::SE]]
|
@@ -178,16 +207,16 @@ module Noise
|
|
178
207
|
end
|
179
208
|
|
180
209
|
class PatternXX < Pattern
|
181
|
-
def initialize
|
182
|
-
super
|
210
|
+
def initialize(modifiers)
|
211
|
+
super(modifiers)
|
183
212
|
@name = 'XX'
|
184
213
|
@tokens = [[Token::E], [Token::E, Token::EE, Token::S, Token::ES], [Token::S, Token::SE]]
|
185
214
|
end
|
186
215
|
end
|
187
216
|
|
188
217
|
class PatternIX < Pattern
|
189
|
-
def initialize
|
190
|
-
super
|
218
|
+
def initialize(modifiers)
|
219
|
+
super(modifiers)
|
191
220
|
@name = 'IX'
|
192
221
|
@tokens = [[Token::E, Token::S], [Token::E, Token::EE, Token::SE, Token::S, Token::ES]]
|
193
222
|
end
|
data/lib/noise/protocol.rb
CHANGED
@@ -2,11 +2,13 @@
|
|
2
2
|
|
3
3
|
module Noise
|
4
4
|
class Protocol
|
5
|
-
attr_accessor :prologue, :initiator
|
5
|
+
attr_accessor :prologue, :initiator
|
6
|
+
attr_accessor :cipher_state_encrypt, :cipher_state_decrypt
|
7
|
+
attr_accessor :cipher_state_handshake
|
8
|
+
attr_accessor :psks
|
6
9
|
attr_reader :name, :cipher_fn, :hash_fn, :dh_fn, :hkdf_fn, :pattern
|
7
10
|
attr_reader :handshake_state, :keypairs, :keypair_fn
|
8
11
|
attr_reader :handshake_hash
|
9
|
-
attr_accessor :cipher_state_handshake
|
10
12
|
|
11
13
|
CIPHER = {
|
12
14
|
'AESGCM': Noise::Functions::Cipher::AesGcm,
|
@@ -14,8 +16,8 @@ module Noise
|
|
14
16
|
}.stringify_keys.freeze
|
15
17
|
|
16
18
|
DH = {
|
17
|
-
'25519': Noise::Functions::DH::
|
18
|
-
'448': Noise::Functions::DH::
|
19
|
+
'25519': Noise::Functions::DH::ED25519,
|
20
|
+
'448': Noise::Functions::DH::ED448
|
19
21
|
}.stringify_keys.freeze
|
20
22
|
|
21
23
|
HASH = {
|
@@ -33,12 +35,17 @@ module Noise
|
|
33
35
|
|
34
36
|
def initialize(name, pattern_name, cipher_name, hash_name, dh_name)
|
35
37
|
@name = name
|
36
|
-
@pattern = Noise::Pattern.create(pattern_name
|
38
|
+
@pattern = Noise::Pattern.create(pattern_name)
|
37
39
|
@keypairs = { s: nil, e: nil, rs: nil, re: nil }
|
38
40
|
@cipher_fn = CIPHER[cipher_name]&.new
|
39
41
|
@hash_fn = HASH[hash_name]&.new
|
40
42
|
@dh_fn = DH[dh_name]&.new
|
41
43
|
@hkdf_fn = Noise::Functions::Hash.create_hkdf_fn(hash_name)
|
44
|
+
@psks = nil
|
45
|
+
@is_psk_handshake = @pattern.modifiers.any? { |m| m.start_with?('psk') }
|
46
|
+
|
47
|
+
@pattern.apply_pattern_modifiers
|
48
|
+
|
42
49
|
raise Noise::Exceptions::ProtocolNameError unless @cipher_fn && @hash_fn && @dh_fn
|
43
50
|
end
|
44
51
|
|
@@ -63,14 +70,16 @@ module Noise
|
|
63
70
|
end
|
64
71
|
|
65
72
|
def validate
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
73
|
+
if psk_handshake?
|
74
|
+
if @psks.any? {|psk| psk.bytesize != 32}
|
75
|
+
raise NoisePSKError # Invalid psk length! Has to be 32 bytes long
|
76
|
+
end
|
77
|
+
if @pattern.psk_count != @psks.count
|
78
|
+
# Bad number of PSKs provided to this protocol! {} are required,
|
79
|
+
# given {}'.format(self.pattern.psk_count, len(self.psks)))
|
80
|
+
raise NoisePSKError
|
81
|
+
end
|
82
|
+
end
|
74
83
|
|
75
84
|
# You need to set role with NoiseConnection.set_as_initiator
|
76
85
|
# or NoiseConnection.set_as_responder
|
@@ -103,5 +112,9 @@ module Noise
|
|
103
112
|
)
|
104
113
|
@symmetric_state = @handshake_state.symmetric_state
|
105
114
|
end
|
115
|
+
|
116
|
+
def psk_handshake?
|
117
|
+
@is_psk_handshake
|
118
|
+
end
|
106
119
|
end
|
107
120
|
end
|
@@ -63,6 +63,7 @@ module Noise
|
|
63
63
|
@e = dh_fn.generate_keypair if @e.compact.empty?
|
64
64
|
message_buffer << @e[1]
|
65
65
|
@symmetric_state.mix_hash(@e[1])
|
66
|
+
@symmetric_state.mix_key(@e[1]) if @protocol.psk_handshake?
|
66
67
|
next
|
67
68
|
when 's'
|
68
69
|
message_buffer << @symmetric_state.encrypt_and_hash(@s[1])
|
@@ -87,6 +88,9 @@ module Noise
|
|
87
88
|
when 'ss'
|
88
89
|
@symmetric_state.mix_key(dh_fn.dh(@s[0], @rs[1]))
|
89
90
|
next
|
91
|
+
when 'psk'
|
92
|
+
@symmetric_state.mix_key_and_hash(@protocol.psks.shift)
|
93
|
+
next
|
90
94
|
end
|
91
95
|
end
|
92
96
|
message_buffer << @symmetric_state.encrypt_and_hash(payload)
|
@@ -103,6 +107,7 @@ module Noise
|
|
103
107
|
@re = @protocol.dh_fn.class.from_public(message[0...len]) if @re.compact.empty?
|
104
108
|
message = message[len..-1]
|
105
109
|
@symmetric_state.mix_hash(@re[1])
|
110
|
+
@symmetric_state.mix_key(@re[1]) if @protocol.psk_handshake?
|
106
111
|
next
|
107
112
|
when 's'
|
108
113
|
offset = @protocol.cipher_state_handshake.key? ? 16 : 0
|
@@ -130,6 +135,9 @@ module Noise
|
|
130
135
|
when 'ss'
|
131
136
|
@symmetric_state.mix_key(dh_fn.dh(@s[0], @rs[1]))
|
132
137
|
next
|
138
|
+
when 'psk'
|
139
|
+
@symmetric_state.mix_key_and_hash(@protocol.psks.shift)
|
140
|
+
next
|
133
141
|
end
|
134
142
|
end
|
135
143
|
payload_buffer << @symmetric_state.decrypt_and_hash(message)
|
data/lib/noise/version.rb
CHANGED
data/noise.gemspec
CHANGED
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.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hajime Yamaguchi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -131,15 +131,17 @@ files:
|
|
131
131
|
- lib/noise/exceptions.rb
|
132
132
|
- lib/noise/exceptions/max_nonce_error.rb
|
133
133
|
- lib/noise/exceptions/noise_handshake_error.rb
|
134
|
+
- lib/noise/exceptions/noise_psk_error.rb
|
134
135
|
- lib/noise/exceptions/noise_validation_error.rb
|
135
136
|
- lib/noise/exceptions/protocol_name_error.rb
|
137
|
+
- lib/noise/exceptions/psk_value_error.rb
|
136
138
|
- lib/noise/functions.rb
|
137
139
|
- lib/noise/functions/cipher.rb
|
138
140
|
- lib/noise/functions/cipher/aes_gcm.rb
|
139
141
|
- lib/noise/functions/cipher/cha_cha_poly.rb
|
140
142
|
- lib/noise/functions/dh.rb
|
141
|
-
- lib/noise/functions/dh/
|
142
|
-
- lib/noise/functions/dh/
|
143
|
+
- lib/noise/functions/dh/ed25519.rb
|
144
|
+
- lib/noise/functions/dh/ed448.rb
|
143
145
|
- lib/noise/functions/dh/secp256k1.rb
|
144
146
|
- lib/noise/functions/hash.rb
|
145
147
|
- lib/noise/functions/hash/blake2b.rb
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Noise
|
4
|
-
module Functions
|
5
|
-
module DH
|
6
|
-
class DH25519
|
7
|
-
DHLEN = 32
|
8
|
-
def generate_keypair
|
9
|
-
private_key = RbNaCl::Signatures::Ed25519::SigningKey.generate
|
10
|
-
public_key = private_key.verify_key
|
11
|
-
[private_key.to_bytes, public_key.to_bytes]
|
12
|
-
end
|
13
|
-
|
14
|
-
def dh(private_key, public_key)
|
15
|
-
point = RbNaCl::GroupElement.new(public_key).mult(private_key)
|
16
|
-
point.to_bytes
|
17
|
-
end
|
18
|
-
|
19
|
-
def dhlen
|
20
|
-
DHLEN
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.from_private(private_key)
|
24
|
-
private_key = RbNaCl::GroupElements::Curve25519.new(private_key)
|
25
|
-
public_key = RbNaCl::GroupElements::Curve25519.base.mult(private_key)
|
26
|
-
[private_key.to_bytes, public_key.to_bytes]
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.from_public(public_key)
|
30
|
-
public_key = RbNaCl::Signatures::Ed25519::VerifyKey.new(public_key)
|
31
|
-
[nil, public_key.to_bytes]
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|