lightning-onion 0.2.2 → 0.2.3
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/lib/lightning/onion/packet.rb +11 -13
- data/lib/lightning/onion/per_hop.rb +19 -3
- data/lib/lightning/onion/sphinx.rb +27 -33
- data/lib/lightning/onion/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ab9c2e28c21df3eaba32de0c6f94e42fd20706c
|
4
|
+
data.tar.gz: e959dd65032a7f2da7691bce6fb88b2fb204b3ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1d3b593b58cb084effcadf2ba13e005aad49883cd1f51913fedb9cc9a5e6513878378511b76374007f7e63db62932908b1d7c9c3bddfc78db79a2e94314bb23
|
7
|
+
data.tar.gz: 30f204b6fffe908f3a9d8cc233d30285610a374f50f3e55ce82e7c021788d5a59618ac4049ad41177890a3ce968ec33f4a52ed91107c7d2e8f4dedf870764ac9
|
@@ -3,29 +3,27 @@
|
|
3
3
|
module Lightning
|
4
4
|
module Onion
|
5
5
|
class Packet
|
6
|
-
attr_accessor :version, :public_key, :
|
7
|
-
def initialize(version, public_key,
|
6
|
+
attr_accessor :version, :public_key, :routing_info, :hmac
|
7
|
+
def initialize(version, public_key, routing_info, hmac)
|
8
8
|
@version = version
|
9
9
|
@public_key = public_key
|
10
|
-
@
|
10
|
+
@routing_info = routing_info
|
11
|
+
raise "invalid size #{routing_info.size}" unless routing_info.size == 1300 * 2
|
11
12
|
@hmac = hmac
|
12
13
|
end
|
13
14
|
|
14
15
|
def self.parse(payload)
|
15
|
-
version, public_key, rest = payload.unpack('
|
16
|
-
|
17
|
-
20
|
18
|
-
|
19
|
-
end
|
20
|
-
hmac = rest[21 * 65..-1]
|
21
|
-
new(version, public_key, hops_data, hmac)
|
16
|
+
version, public_key, rest = payload.unpack('aH66a*')
|
17
|
+
routing_info = rest[0...20 * 65].bth
|
18
|
+
hmac = rest[20 * 65..-1].bth
|
19
|
+
new(version, public_key, routing_info, hmac)
|
22
20
|
end
|
23
21
|
|
24
22
|
def to_payload
|
25
23
|
payload = +''
|
26
|
-
payload << [version
|
27
|
-
payload <<
|
28
|
-
payload << hmac
|
24
|
+
payload << [version, public_key].pack('aH66')
|
25
|
+
payload << routing_info.htb
|
26
|
+
payload << hmac.htb
|
29
27
|
payload
|
30
28
|
end
|
31
29
|
end
|
@@ -12,13 +12,29 @@ module Lightning
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.parse(payload)
|
15
|
-
new(*payload.unpack('Q>
|
15
|
+
new(*payload.unpack('Q>2Na12'))
|
16
16
|
end
|
17
|
+
LAST_NODE = PerHop.parse("\x00" * 32)
|
17
18
|
|
18
19
|
def to_payload
|
19
|
-
|
20
|
+
to_a.pack('Q>2Na12')
|
21
|
+
end
|
22
|
+
|
23
|
+
def ==(other)
|
24
|
+
other.class == self.class && other.to_a == to_a
|
25
|
+
end
|
26
|
+
|
27
|
+
alias eql? ==
|
28
|
+
|
29
|
+
def hash
|
30
|
+
to_a.hash
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
def to_a
|
36
|
+
[short_channel_id, amt_to_forward, outgoing_cltv_value, padding]
|
20
37
|
end
|
21
|
-
LAST_NODE = PerHop.parse("\x00" * 32)
|
22
38
|
end
|
23
39
|
end
|
24
40
|
end
|
@@ -11,8 +11,7 @@ module Lightning
|
|
11
11
|
MAX_ERROR_PAYLOAD_LENGTH = 256
|
12
12
|
ERROR_PACKET_LENGTH = MAC_LENGTH + MAX_ERROR_PAYLOAD_LENGTH + 2 + 2
|
13
13
|
|
14
|
-
|
15
|
-
LAST_PACKET = Lightning::Onion::Packet.new(VERSION, "\x00" * 33, [ZERO_HOP] * MAX_HOPS, "\x00" * MAC_LENGTH)
|
14
|
+
LAST_PACKET = Lightning::Onion::Packet.new(VERSION, "\x00" * 33, '00' * MAX_HOPS * HOP_LENGTH, '00' * MAC_LENGTH)
|
16
15
|
|
17
16
|
def self.make_packet(session_key, public_keys, payloads, associated_data)
|
18
17
|
ephemereal_public_keys, shared_secrets = compute_keys_and_secrets(session_key, public_keys)
|
@@ -35,6 +34,25 @@ module Lightning
|
|
35
34
|
[packet, shared_secrets.zip(public_keys)]
|
36
35
|
end
|
37
36
|
|
37
|
+
# @return payload 33bytes payload of the outermost layer of onions,which including realm
|
38
|
+
# @return packet
|
39
|
+
def self.parse(private_key, raw_packet)
|
40
|
+
packet = Lightning::Onion::Packet.parse(raw_packet)
|
41
|
+
shared_secret = compute_shared_secret(packet.public_key, private_key)
|
42
|
+
rho = generate_key('rho', shared_secret)
|
43
|
+
bin = xor(
|
44
|
+
(packet.routing_info + '00' * HOP_LENGTH).htb.unpack('C*'),
|
45
|
+
generate_cipher_stream(rho, HOP_LENGTH + MAX_HOPS * HOP_LENGTH).unpack('C*')
|
46
|
+
)
|
47
|
+
payload = bin[0...HOP_LENGTH].pack('C*')
|
48
|
+
hmac = bin[PAYLOAD_LENGTH...HOP_LENGTH].pack('C*')
|
49
|
+
next_hops_data = bin[HOP_LENGTH..-1]
|
50
|
+
|
51
|
+
next_public_key = make_blind(packet.public_key, compute_blinding_factor(packet.public_key, shared_secret))
|
52
|
+
routing_info = next_hops_data.pack('C*').bth
|
53
|
+
[Lightning::Onion::HopData.parse(payload), Lightning::Onion::Packet.new(VERSION, next_public_key, routing_info, hmac.bth), shared_secret]
|
54
|
+
end
|
55
|
+
|
38
56
|
def self.internal_make_packet(hop_payloads, keys, shared_secrets, packet, associated_data)
|
39
57
|
return packet if hop_payloads.empty?
|
40
58
|
next_packet = make_next_packet(hop_payloads.last, associated_data, keys.last, shared_secrets.last, packet)
|
@@ -42,8 +60,9 @@ module Lightning
|
|
42
60
|
end
|
43
61
|
|
44
62
|
def self.make_next_packet(payload, associated_data, ephemereal_public_key, shared_secret, packet, filler = '')
|
45
|
-
hops_data1 = payload.htb << packet.hmac << packet.
|
46
|
-
|
63
|
+
hops_data1 = payload.htb << packet.hmac.htb << packet.routing_info.htb[0...-HOP_LENGTH]
|
64
|
+
rho_key = generate_key('rho', shared_secret)
|
65
|
+
stream = generate_cipher_stream(rho_key, MAX_HOPS * HOP_LENGTH)
|
47
66
|
hops_data2 = xor(hops_data1.unpack('C*'), stream.unpack('C*'))
|
48
67
|
next_hops_data =
|
49
68
|
if filler.empty?
|
@@ -51,14 +70,10 @@ module Lightning
|
|
51
70
|
else
|
52
71
|
hops_data2[0...-filler.htb.unpack('C*').size] + filler.htb.unpack('C*')
|
53
72
|
end
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
hops_data << Lightning::Onion::HopData.parse(payload)
|
59
|
-
end
|
60
|
-
|
61
|
-
Lightning::Onion::Packet.new(VERSION, ephemereal_public_key, hops_data, next_hmac)
|
73
|
+
mu_key = generate_key('mu', shared_secret)
|
74
|
+
next_hmac = mac(mu_key, next_hops_data + associated_data.htb.unpack('C*'))
|
75
|
+
routing_info = next_hops_data.pack('C*').bth
|
76
|
+
Lightning::Onion::Packet.new(VERSION, ephemereal_public_key, routing_info, next_hmac.bth)
|
62
77
|
end
|
63
78
|
|
64
79
|
def self.compute_keys_and_secrets(session_key, public_keys)
|
@@ -157,27 +172,6 @@ module Lightning
|
|
157
172
|
hmac256(key, message.pack('C*'))[0...MAC_LENGTH]
|
158
173
|
end
|
159
174
|
|
160
|
-
def self.parse(private_key, raw_packet)
|
161
|
-
packet = Lightning::Onion::Packet.parse(raw_packet)
|
162
|
-
shared_secret = compute_shared_secret(packet.public_key, private_key)
|
163
|
-
rho = generate_key('rho', shared_secret)
|
164
|
-
bin = xor(
|
165
|
-
(packet.hops_data.map(&:to_payload).join + "\x00" * HOP_LENGTH).unpack('C*'),
|
166
|
-
generate_cipher_stream(rho, HOP_LENGTH + MAX_HOPS * HOP_LENGTH).unpack('C*')
|
167
|
-
)
|
168
|
-
payload = bin[0...PAYLOAD_LENGTH].pack('C*')
|
169
|
-
hmac = bin[PAYLOAD_LENGTH...HOP_LENGTH].pack('C*')
|
170
|
-
next_hops_data = bin[HOP_LENGTH..-1]
|
171
|
-
|
172
|
-
next_public_key = make_blind(packet.public_key, compute_blinding_factor(packet.public_key, shared_secret))
|
173
|
-
hops_data = []
|
174
|
-
20.times do |i|
|
175
|
-
hop_payload = next_hops_data.pack('C*')[i * HOP_LENGTH...(i + 1) * HOP_LENGTH]
|
176
|
-
hops_data << Lightning::Onion::HopData.parse(hop_payload)
|
177
|
-
end
|
178
|
-
[payload, Lightning::Onion::Packet.new(VERSION, next_public_key, hops_data, hmac), shared_secret]
|
179
|
-
end
|
180
|
-
|
181
175
|
def self.make_error_packet(shared_secret, failure)
|
182
176
|
message = failure.to_payload
|
183
177
|
um = generate_key('um', shared_secret)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lightning-onion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hajime Yamaguchi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: algebrick
|