pathgraph_encoding 0.0.2 → 0.0.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/pathgraph_encoding/version.rb +4 -1
- data/lib/pathgraph_encoding.rb +68 -14
- data/pathgraph_encoding.gemspec +4 -1
- data/test/test_pathgraph.rb +27 -0
- data/test/test_pathgraph_privatekey.rb +3 -1
- data/test/test_pathgraph_publickey.rb +36 -0
- metadata +9 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 34c1f39199c77a438522e9223ad23f6f76443e1b
|
|
4
|
+
data.tar.gz: 4983a1ca55c12384d73fd67d72afbfcbd58bd128
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1daf7a42f5318483a8e205297f3fad5c82e016b21d993e5628abe00579bf406c62689f90bbcf7a2fb4c574120d0148ac4ce482cead5968551485b68bc660c9a6
|
|
7
|
+
data.tar.gz: 6274c878da0a5380a1b7ea973f90d73106b48a965a7fe5389b1756cba1cf77dbfcfce7f0fdd377ecb8e88ef55eeffbab4aa2e3d495ffd88aa5fe1e0f66ea756d
|
data/lib/pathgraph_encoding.rb
CHANGED
|
@@ -1,10 +1,32 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'pathgraph_encoding/version'
|
|
2
2
|
require 'openssl'
|
|
3
|
-
require 'pp'
|
|
4
3
|
|
|
5
4
|
# @author Israel Buitron
|
|
6
5
|
module PathgraphEncoding
|
|
7
6
|
|
|
7
|
+
def self.pack(k, m, set)
|
|
8
|
+
OpenSSL::ASN1::Sequence.new([
|
|
9
|
+
OpenSSL::ASN1::Integer.new(k),
|
|
10
|
+
OpenSSL::ASN1::Integer.new(m),
|
|
11
|
+
OpenSSL::ASN1::Sequence.new(
|
|
12
|
+
set.map { |path|
|
|
13
|
+
OpenSSL::ASN1::Sequence.new(
|
|
14
|
+
path.map { |x| OpenSSL::ASN1::Integer.new(x) }
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
)
|
|
18
|
+
]).to_der
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.unpack(der)
|
|
22
|
+
asn1 = OpenSSL::ASN1.decode(der)
|
|
23
|
+
[
|
|
24
|
+
OpenSSL::ASN1.decode(asn1.value[0]).value.to_i, # k
|
|
25
|
+
OpenSSL::ASN1.decode(asn1.value[1]).value.to_i, # m
|
|
26
|
+
OpenSSL::ASN1.decode(asn1.value[2]).value.map { |e| e.map { |d| d.value.to_i } }
|
|
27
|
+
]
|
|
28
|
+
end
|
|
29
|
+
|
|
8
30
|
# Represents a pathgraph private key.
|
|
9
31
|
#
|
|
10
32
|
# An instance of a private key can be like this:
|
|
@@ -136,11 +158,19 @@ module PathgraphEncoding
|
|
|
136
158
|
(a^b).to_s(2).count(1) == 1
|
|
137
159
|
end
|
|
138
160
|
|
|
161
|
+
# Generates a public key from a private key.
|
|
162
|
+
#
|
|
163
|
+
# == Parameters:
|
|
164
|
+
# key::
|
|
165
|
+
# Public key.
|
|
166
|
+
#
|
|
167
|
+
# == Returns:
|
|
168
|
+
# Public key related with private one parameterized.
|
|
169
|
+
#
|
|
139
170
|
def self.gen_public_key(key)
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
171
|
+
sigma = []
|
|
172
|
+
key[:pi].each { |p| sigma << [p.first,p.last] }
|
|
173
|
+
{n: key[:n], sigma: sigma}
|
|
144
174
|
end
|
|
145
175
|
|
|
146
176
|
end
|
|
@@ -159,8 +189,6 @@ module PathgraphEncoding
|
|
|
159
189
|
#
|
|
160
190
|
def self.to_der(key)
|
|
161
191
|
n = OpenSSL::ASN1::Integer.new(key[:n])
|
|
162
|
-
# m = OpenSSL::ASN1::Integer.new(key[:m])
|
|
163
|
-
# k = OpenSSL::ASN1::Integer.new(key[:k])
|
|
164
192
|
sigma = OpenSSL::ASN1::Sequence.new(
|
|
165
193
|
key[:sigma].map do |sig|
|
|
166
194
|
arr = sig.map { |x| OpenSSL::ASN1::Integer.new(x) }
|
|
@@ -169,7 +197,7 @@ module PathgraphEncoding
|
|
|
169
197
|
)
|
|
170
198
|
publicKey = OpenSSL::ASN1::Sequence.new([n,sigma])
|
|
171
199
|
|
|
172
|
-
version = OpenSSL::ASN1::PrintableString.new(
|
|
200
|
+
version = OpenSSL::ASN1::PrintableString.new(PathgraphEncoding::VERSION)
|
|
173
201
|
instance = OpenSSL::ASN1::Sequence.new([version,publicKey])
|
|
174
202
|
|
|
175
203
|
instance.to_der
|
|
@@ -187,21 +215,47 @@ module PathgraphEncoding
|
|
|
187
215
|
# The public key dencoded.
|
|
188
216
|
#
|
|
189
217
|
def self.from_der(der)
|
|
190
|
-
#
|
|
218
|
+
# Decode DER bytes
|
|
219
|
+
asn1 = OpenSSL::ASN1.decode(der)
|
|
220
|
+
|
|
221
|
+
# Public key build from DER bytes
|
|
222
|
+
{
|
|
223
|
+
version: OpenSSL::ASN1.decode(asn1.value[0]).value,
|
|
224
|
+
n: OpenSSL::ASN1.decode(asn1.value[1].value[0]).value.to_i,
|
|
225
|
+
sigma: OpenSSL::ASN1.decode(asn1.value[1].value[1]).value.map { |e| e.map { |d| d.value.to_i } }
|
|
226
|
+
}
|
|
191
227
|
end
|
|
192
228
|
|
|
193
229
|
# Check if is a valid public key.
|
|
230
|
+
#
|
|
231
|
+
# === Implemented validations
|
|
232
|
+
#
|
|
233
|
+
# - Hypercube degree (n) is valid if:
|
|
234
|
+
# - Is an integer, such that is greater than 4
|
|
235
|
+
# (`PathgraphEncoding::MIN_Q_N`).
|
|
236
|
+
# - Set (sigma) of pairs of endpoint vertices is valid if:
|
|
237
|
+
# - For each pair of vertices in set, each vertex is:
|
|
238
|
+
# - A non negative integer, such that is less than 2 to n.
|
|
194
239
|
#
|
|
195
240
|
# == Parameters:
|
|
196
241
|
# key::
|
|
197
|
-
# A
|
|
242
|
+
# A Hash object representing the public key specified.
|
|
198
243
|
#
|
|
199
244
|
# == Returns:
|
|
200
|
-
# Returns `true` if
|
|
201
|
-
# `false`.
|
|
245
|
+
# Returns `true` if key satisfies implemented validations,
|
|
246
|
+
# otherwise `false`.
|
|
202
247
|
#
|
|
203
248
|
def self.is_valid?(key)
|
|
204
|
-
#
|
|
249
|
+
# Check valid hypercube degree (n)
|
|
250
|
+
return false if !key[:n].is_a? Integer || key[:n]<MIN_Q_N
|
|
251
|
+
|
|
252
|
+
# Check vertices valid in hypercube Q_n
|
|
253
|
+
max_vertex = (1<<key[:n])-1
|
|
254
|
+
key[:sigma].flatten.each do |vertex|
|
|
255
|
+
return false if !vertex.is_a? Integer || vertex>max_vertex || vertex<0
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
true
|
|
205
259
|
end
|
|
206
260
|
|
|
207
261
|
end
|
data/pathgraph_encoding.gemspec
CHANGED
|
@@ -8,7 +8,10 @@ Gem::Specification.new do |spec|
|
|
|
8
8
|
spec.authors = ["Israel Buitron"]
|
|
9
9
|
spec.email = ["ibuitron@ipn.mx"]
|
|
10
10
|
spec.summary = %q{PathgraphEnconding is a library to encode Pathgraph keys to ASN.1}
|
|
11
|
-
spec.description =
|
|
11
|
+
spec.description = <<-EOF
|
|
12
|
+
PathgraphEnconding is a library to encode and decode Pathgraph
|
|
13
|
+
keys (public and private) to ASN.1 DER format.
|
|
14
|
+
EOF
|
|
12
15
|
spec.homepage = "http://computacion.cs.cinvestav.mx/~ibuitron/"
|
|
13
16
|
spec.license = "MIT"
|
|
14
17
|
spec.metadata = { 'issue_tracker' => "https://gitlab.com/israelbuitron/pathgraph_encoding/issues" }
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'minitest/autorun'
|
|
2
|
+
require 'pathgraph_encoding'
|
|
3
|
+
|
|
4
|
+
class TestPathGraph < Minitest::Test
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@k = 4
|
|
8
|
+
@m = 4
|
|
9
|
+
@pi = [[0,1,3,2],[6,7,5,4],[12,13,15,14],[10,11,9,8]]
|
|
10
|
+
@der = "0@\x02\x01\x04\x02\x01\x04080\f\x02\x01\x00\x02\x01"\
|
|
11
|
+
"\x01\x02\x01\x03\x02\x01\x020\f\x02\x01\x06\x02\x01\a\x02\x01"\
|
|
12
|
+
"\x05\x02\x01\x040\f\x02\x01\f\x02\x01\r\x02\x01\x0F\x02\x01"\
|
|
13
|
+
"\x0E0\f\x02\x01\n\x02\x01\v\x02\x01\t\x02\x01\b"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_pack
|
|
17
|
+
der = PathgraphEncoding.pack(@k, @m, @pi)
|
|
18
|
+
assert_equal 66, der.size
|
|
19
|
+
assert_equal @der, der
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_unpack
|
|
23
|
+
tuple = PathgraphEncoding.unpack(@der)
|
|
24
|
+
assert_equal [@k,@m,@pi], tuple
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -46,8 +46,10 @@ class TestPathGraphPrivateKey < Minitest::Test
|
|
|
46
46
|
n: 4,
|
|
47
47
|
sigma: [[0,2],[6,4],[12,14],[10,8]]
|
|
48
48
|
}
|
|
49
|
-
key = PathgraphEncoding::PrivateKey
|
|
49
|
+
key = PathgraphEncoding::PrivateKey.gen_public_key(@private_key)
|
|
50
50
|
assert_equal expected, key
|
|
51
|
+
refute_same @private_key, key
|
|
52
|
+
refute_same @private_key[:pi], key[:sigma]
|
|
51
53
|
end
|
|
52
54
|
|
|
53
55
|
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'minitest/autorun'
|
|
2
|
+
require 'pathgraph_encoding'
|
|
3
|
+
|
|
4
|
+
class TestPathGraphPublicKey < Minitest::Test
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@public_key = {
|
|
8
|
+
n: 4,
|
|
9
|
+
sigma: [[0,2],[6,4],[12,14],[10,8]]
|
|
10
|
+
}
|
|
11
|
+
@der_public_key = "0.\x13\x05#{PathgraphEncoding::VERSION}0%"\
|
|
12
|
+
"\x02\x01\x040 0\x06\x02\x01\x00\x02\x01\x020\x06\x02\x01\x06"\
|
|
13
|
+
"\x02\x01\x040\x06\x02\x01\f\x02\x01\x0E0\x06\x02\x01\n\x02"\
|
|
14
|
+
"\x01\b"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_to_der
|
|
18
|
+
der = PathgraphEncoding::PublicKey::to_der(@public_key)
|
|
19
|
+
|
|
20
|
+
assert_equal 48, der.size
|
|
21
|
+
assert_equal @der_public_key, der
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_from_der
|
|
25
|
+
key = PathgraphEncoding::PublicKey::from_der(@der_public_key)
|
|
26
|
+
exp = {version: PathgraphEncoding::VERSION,
|
|
27
|
+
n: 4,
|
|
28
|
+
sigma: [[0,2],[6,4],[12,14],[10,8]]}
|
|
29
|
+
assert_equal key, exp
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_is_valid
|
|
33
|
+
assert PathgraphEncoding::PublicKey::is_valid?(@public_key)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pathgraph_encoding
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Israel Buitron
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-07
|
|
11
|
+
date: 2015-08-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -38,8 +38,9 @@ dependencies:
|
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '10.4'
|
|
41
|
-
description:
|
|
42
|
-
|
|
41
|
+
description: |2
|
|
42
|
+
PathgraphEnconding is a library to encode and decode Pathgraph
|
|
43
|
+
keys (public and private) to ASN.1 DER format.
|
|
43
44
|
email:
|
|
44
45
|
- ibuitron@ipn.mx
|
|
45
46
|
executables: []
|
|
@@ -57,7 +58,9 @@ files:
|
|
|
57
58
|
- lib/pathgraph_encoding.rb
|
|
58
59
|
- lib/pathgraph_encoding/version.rb
|
|
59
60
|
- pathgraph_encoding.gemspec
|
|
61
|
+
- test/test_pathgraph.rb
|
|
60
62
|
- test/test_pathgraph_privatekey.rb
|
|
63
|
+
- test/test_pathgraph_publickey.rb
|
|
61
64
|
homepage: http://computacion.cs.cinvestav.mx/~ibuitron/
|
|
62
65
|
licenses:
|
|
63
66
|
- MIT
|
|
@@ -84,5 +87,7 @@ signing_key:
|
|
|
84
87
|
specification_version: 4
|
|
85
88
|
summary: PathgraphEnconding is a library to encode Pathgraph keys to ASN.1
|
|
86
89
|
test_files:
|
|
90
|
+
- test/test_pathgraph.rb
|
|
87
91
|
- test/test_pathgraph_privatekey.rb
|
|
92
|
+
- test/test_pathgraph_publickey.rb
|
|
88
93
|
has_rdoc:
|