exonum-client-ruby 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2234809e9ae540d2ae606a94240b4c2f7643a03473617058824e115dd5d60b21
4
- data.tar.gz: f731faae600d904377c8a504f6ae7efe9537bae7cce5c47f1ce3bea78838d0ef
3
+ metadata.gz: d36a7b3d7326dfd340b7fe57359f9a1108085dcfe9ca321b6df76e5fa683e2e7
4
+ data.tar.gz: 3f55e725815ef517cf2ded1ed3c8169799f6e129866acf7a310d55bd8d9db08f
5
5
  SHA512:
6
- metadata.gz: 503e23958b618d4262619dd97d68e157bf30536ef50ac3ee884c04449186a3d57eacca34bf258267604485644d6471986cfbbaadc097c3b4f22b2fa4373f3954
7
- data.tar.gz: 96ed0b2cca0afc8f645796638dcbb19760576e95de4f2d674bc85b5374305fbda3d93b26a97a9138140a62a7efc1f51a1318bafa9314e44811742a8f0ab4ecc8
6
+ metadata.gz: 226eaf5744c50639be204c53865d2ed3b263dc07152af6c909d60c56974fc715706a3c1c38be2e3295df4e628b05029c183f9d04b6d9e8aeca68344bdd90cf73
7
+ data.tar.gz: 1e2ba10868bc82cf0dd89e41bd8956ed078e25f979e7e82a88825de3ba376d076df17217d6b6de315dd3a1adf52c4148f1b42b7bd83971cd05d26bdaf3bf641f
@@ -3,7 +3,7 @@ require 'sparse_array'
3
3
  require 'ed25519'
4
4
  require 'securerandom'
5
5
  require 'exonum/util/sparse_array'
6
- require 'exonum/util/seed'
6
+ require 'exonum/util/random'
7
7
  require 'exonum/types/primitive'
8
8
  require 'exonum/types/struct'
9
9
  require 'exonum/types/array'
@@ -17,8 +17,8 @@ module Exonum
17
17
 
18
18
  def serialize data, buffer, from=0, shift=0
19
19
  raise "Expecting array" unless data.is_a?(Array)
20
- UInt32T.new.serialize buffer.length, buffer, from
21
- UInt32T.new.serialize data.length, buffer, from + 4
20
+ UInt32T.serialize buffer.length, buffer, from
21
+ UInt32T.serialize data.length, buffer, from + 4
22
22
  if value_type.is_a?(StringT)
23
23
  start = buffer.length
24
24
  (start..(data.length*8-1)).each do |i|
@@ -27,9 +27,9 @@ module Exonum
27
27
  (0..(data.length-1)).each do |i|
28
28
  index = start + i*8
29
29
  finish = buffer.length
30
- UInt32T.new.serialize finish - shift, buffer, index
30
+ UInt32T.serialize finish - shift, buffer, index
31
31
  value_type.serialize data[i], buffer, finish
32
- UInt32T.new.serialize buffer.length - finish, buffer, index + 4
32
+ UInt32T.serialize buffer.length - finish, buffer, index + 4
33
33
  end
34
34
  elsif value_type.is_a?(ArrayT)
35
35
  start = buffer.length
@@ -12,16 +12,16 @@ module Exonum
12
12
  self.message_id = message_id
13
13
  self.service_id = service_id
14
14
  self.head = StructT.new([
15
- { name: 'network_id', type: UInt8T.new },
16
- { name: 'protocol_version', type: UInt8T.new },
17
- { name: 'message_id', type: UInt16T.new },
18
- { name: 'service_id', type: UInt16T.new },
19
- { name: 'payload', type: UInt32T.new }
15
+ { name: 'network_id', type: UInt8T },
16
+ { name: 'protocol_version', type: UInt8T },
17
+ { name: 'message_id', type: UInt16T },
18
+ { name: 'service_id', type: UInt16T },
19
+ { name: 'payload', type: UInt32T }
20
20
  ])
21
21
  self.body = body
22
22
  end
23
23
 
24
- def serialize data, cutSignature
24
+ def serialize data
25
25
  buffer = SparseArray.new
26
26
  head_data = {
27
27
  network_id: 0,
@@ -32,17 +32,14 @@ module Exonum
32
32
  }
33
33
  head.serialize head_data, buffer, 0
34
34
  body.serialize data, buffer, head.size, 0, true
35
- UInt32T.new.serialize buffer.length + SignatureT.new.size, buffer, 6
36
- unless cutSignature
37
- SignatureT.new.serialize signature, buffer, buffer.length
38
- end
35
+ UInt32T.serialize buffer.length + SignatureT.size, buffer, 6
39
36
  buffer.serialize
40
37
  end
41
38
 
42
39
  def sign secret, data
43
40
  raise "Expecting 64 bytes key in hex" unless secret.is_a?(String) and secret.length == 128
44
41
  key = Ed25519::SigningKey.new [secret[0..63]].pack 'H*'
45
- buffer = serialize(data, true).pack('c*')
42
+ buffer = serialize(data).pack('c*')
46
43
  key.sign(buffer).unpack('H*').first
47
44
  end
48
45
  end
@@ -13,15 +13,15 @@ module Exonum
13
13
  MAX_UINT64 = 18446744073709551615
14
14
 
15
15
  class Int8T
16
- def size
16
+ def self.size
17
17
  1
18
18
  end
19
19
 
20
- def fixed?
20
+ def self.fixed?
21
21
  true
22
22
  end
23
23
 
24
- def serialize value, buffer, from, shift=0
24
+ def self.serialize value, buffer, from, shift=0
25
25
  raise 'Incorrect integer value' if value < MIN_INT8 or value > MAX_INT8
26
26
  [value].pack('c').bytes.each do |byte|
27
27
  buffer[from] = byte
@@ -31,15 +31,15 @@ module Exonum
31
31
  end
32
32
 
33
33
  class UInt8T
34
- def size
34
+ def self.size
35
35
  1
36
36
  end
37
37
 
38
- def fixed?
38
+ def self.fixed?
39
39
  true
40
40
  end
41
41
 
42
- def serialize value, buffer, from, shift=0
42
+ def self.serialize value, buffer, from, shift=0
43
43
  raise 'Incorrect integer value' if value < 0 or value > MAX_UINT8
44
44
  [value].pack('C').bytes.each do |byte|
45
45
  buffer[from] = byte
@@ -49,15 +49,15 @@ module Exonum
49
49
  end
50
50
 
51
51
  class Int16T
52
- def size
52
+ def self.size
53
53
  2
54
54
  end
55
55
 
56
- def fixed?
56
+ def self.fixed?
57
57
  true
58
58
  end
59
59
 
60
- def serialize value, buffer, from, shift=0
60
+ def self.serialize value, buffer, from, shift=0
61
61
  raise 'Incorrect integer value' if value < MIN_INT16 or value > MAX_INT16
62
62
  [value].pack('s<').bytes.each do |byte|
63
63
  buffer[from] = byte
@@ -67,15 +67,15 @@ module Exonum
67
67
  end
68
68
 
69
69
  class UInt16T
70
- def size
70
+ def self.size
71
71
  2
72
72
  end
73
73
 
74
- def fixed?
74
+ def self.fixed?
75
75
  true
76
76
  end
77
77
 
78
- def serialize value, buffer, from, shift=0
78
+ def self.serialize value, buffer, from, shift=0
79
79
  raise 'Incorrect integer value' if value < 0 or value > MAX_UINT16
80
80
  [value].pack('S<').bytes.each do |byte|
81
81
  buffer[from] = byte
@@ -85,15 +85,15 @@ module Exonum
85
85
  end
86
86
 
87
87
  class Int32T
88
- def size
88
+ def self.size
89
89
  4
90
90
  end
91
91
 
92
- def fixed?
92
+ def self.fixed?
93
93
  true
94
94
  end
95
95
 
96
- def serialize value, buffer, from, shift=0
96
+ def self.serialize value, buffer, from, shift=0
97
97
  raise 'Incorrect integer value' if value < MIN_INT32 or value > MAX_INT32
98
98
  [value].pack('l<').bytes.each do |byte|
99
99
  buffer[from] = byte
@@ -103,15 +103,15 @@ module Exonum
103
103
  end
104
104
 
105
105
  class UInt32T
106
- def size
106
+ def self.size
107
107
  4
108
108
  end
109
109
 
110
- def fixed?
110
+ def self.fixed?
111
111
  true
112
112
  end
113
113
 
114
- def serialize value, buffer, from, shift=0
114
+ def self.serialize value, buffer, from, shift=0
115
115
  raise 'Incorrect integer value' if value < 0 or value > MAX_UINT32
116
116
  [value].pack('L<').bytes.each do |byte|
117
117
  buffer[from] = byte
@@ -121,15 +121,15 @@ module Exonum
121
121
  end
122
122
 
123
123
  class Int64T
124
- def size
124
+ def self.size
125
125
  8
126
126
  end
127
127
 
128
- def fixed?
128
+ def self.fixed?
129
129
  true
130
130
  end
131
131
 
132
- def serialize value, buffer, from, shift=0
132
+ def self.serialize value, buffer, from, shift=0
133
133
  [value].pack('q<').bytes.each do |byte|
134
134
  buffer[from] = byte
135
135
  from += 1
@@ -138,15 +138,15 @@ module Exonum
138
138
  end
139
139
 
140
140
  class UInt64T
141
- def size
141
+ def self.size
142
142
  8
143
143
  end
144
144
 
145
- def fixed?
145
+ def self.fixed?
146
146
  true
147
147
  end
148
148
 
149
- def serialize value, buffer, from, shift=0
149
+ def self.serialize value, buffer, from, shift=0
150
150
  [value].pack('Q<').bytes.each do |byte|
151
151
  buffer[from] = byte
152
152
  from += 1
@@ -155,15 +155,15 @@ module Exonum
155
155
  end
156
156
 
157
157
  class Float32T
158
- def size
158
+ def self.size
159
159
  4
160
160
  end
161
161
 
162
- def fixed?
162
+ def self.fixed?
163
163
  true
164
164
  end
165
165
 
166
- def serialize value, buffer, from, shift=0
166
+ def self.serialize value, buffer, from, shift=0
167
167
  [value].pack('e').bytes.each do |byte|
168
168
  buffer[from] = byte
169
169
  from += 1
@@ -172,15 +172,15 @@ module Exonum
172
172
  end
173
173
 
174
174
  class Float64T
175
- def size
175
+ def self.size
176
176
  8
177
177
  end
178
178
 
179
- def fixed?
179
+ def self.fixed?
180
180
  true
181
181
  end
182
182
 
183
- def serialize value, buffer, from, shift=0
183
+ def self.serialize value, buffer, from, shift=0
184
184
  [value].pack('E').bytes.each do |byte|
185
185
  buffer[from] = byte
186
186
  from += 1
@@ -189,29 +189,29 @@ module Exonum
189
189
  end
190
190
 
191
191
  class BoolT
192
- def size
192
+ def self.size
193
193
  1
194
194
  end
195
195
 
196
- def fixed?
196
+ def self.fixed?
197
197
  true
198
198
  end
199
199
 
200
- def serialize value, buffer, from, shift=0
200
+ def self.serialize value, buffer, from, shift=0
201
201
  buffer[from] = value ? 1 : 0
202
202
  end
203
203
  end
204
204
 
205
205
  class PublicKeyT
206
- def size
206
+ def self.size
207
207
  32
208
208
  end
209
209
 
210
- def fixed?
210
+ def self.fixed?
211
211
  true
212
212
  end
213
213
 
214
- def serialize value, buffer, from, shift=0
214
+ def self.serialize value, buffer, from, shift=0
215
215
  raise "Expecting #{size} bytes in hex" unless value.is_a?(String) and value.length == size*2
216
216
  [value].pack('H*').bytes.each do |byte|
217
217
  buffer[from] = byte
@@ -221,15 +221,15 @@ module Exonum
221
221
  end
222
222
 
223
223
  class HashT
224
- def size
224
+ def self.size
225
225
  32
226
226
  end
227
227
 
228
- def fixed?
228
+ def self.fixed?
229
229
  true
230
230
  end
231
231
 
232
- def serialize value, buffer, from, shift=0
232
+ def self.serialize value, buffer, from, shift=0
233
233
  raise "Expecting #{size} bytes in hex" unless value.is_a?(String) and value.length == size*2
234
234
  [value].pack('H*').bytes.each do |byte|
235
235
  buffer[from] = byte
@@ -239,15 +239,15 @@ module Exonum
239
239
  end
240
240
 
241
241
  class SignatureT
242
- def size
242
+ def self.size
243
243
  64
244
244
  end
245
245
 
246
- def fixed?
246
+ def self.fixed?
247
247
  true
248
248
  end
249
249
 
250
- def serialize value, buffer, from, shift=0
250
+ def self.serialize value, buffer, from, shift=0
251
251
  raise "Expecting #{size} bytes in hex" unless value.is_a?(String) and value.length == size*2
252
252
  [value].pack('H*').bytes.each do |byte|
253
253
  buffer[from] = byte
@@ -257,24 +257,24 @@ module Exonum
257
257
  end
258
258
 
259
259
  class StringT
260
- def size
260
+ def self.size
261
261
  8
262
262
  end
263
263
 
264
- def fixed?
264
+ def self.fixed?
265
265
  false
266
266
  end
267
267
 
268
- def serialize value, buffer, from, shift=0
268
+ def self.serialize value, buffer, from, shift=0
269
269
  raise "Expecting string" unless value.is_a?(String)
270
270
  bufferLengthOld = buffer.length
271
271
  bufferLengthNew = bufferLengthOld
272
- UInt32T.new.serialize(bufferLengthOld - shift, buffer, from) # index where string content starts in buffer
272
+ UInt32T.serialize(bufferLengthOld - shift, buffer, from) # index where string content starts in buffer
273
273
  value.bytes.each do |byte|
274
274
  buffer[bufferLengthNew] = byte
275
275
  bufferLengthNew += 1
276
276
  end
277
- UInt32T.new.serialize(bufferLengthNew - bufferLengthOld, buffer, from + 4) # string length
277
+ UInt32T.serialize(bufferLengthNew - bufferLengthOld, buffer, from + 4) # string length
278
278
  end
279
279
  end
280
280
  end
@@ -41,10 +41,10 @@ module Exonum
41
41
  localShift += field[:type].size
42
42
  else
43
43
  bufferLengthOld = buffer.length
44
- UInt32T.new.serialize(bufferLengthOld - nestedShift, buffer, localFrom) # index where string content starts in buffer
44
+ UInt32T.serialize(bufferLengthOld - nestedShift, buffer, localFrom) # index where string content starts in buffer
45
45
  field[:type].serialize value, buffer, bufferLengthOld, nestedShift
46
46
  bufferLengthNew = buffer.length
47
- UInt32T.new.serialize(bufferLengthNew - bufferLengthOld, buffer, localFrom + 4) # string length
47
+ UInt32T.serialize(bufferLengthNew - bufferLengthOld, buffer, localFrom + 4) # string length
48
48
  localShift += 8
49
49
  end
50
50
  else
@@ -0,0 +1,15 @@
1
+ module Exonum
2
+ module Random
3
+ def self.generate_seed
4
+ SecureRandom.random_bytes(16).unpack('Q<').first
5
+ end
6
+
7
+ def self.generate_keypair
8
+ key = Ed25519::SigningKey.generate
9
+ {
10
+ public: key.verify_key.to_bytes.unpack('H*').first,
11
+ private: key.to_bytes.unpack('H*').first
12
+ }
13
+ end
14
+ end
15
+ end
@@ -1,4 +1,4 @@
1
1
  module Exonum
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
4
4
 
@@ -2,7 +2,11 @@ require 'exonum'
2
2
 
3
3
  RSpec.describe 'serialization' do
4
4
  it "can serialize simple structure" do
5
- fields = [{name: 'pubkey', type: Exonum::PublicKeyT.new}, { name: 'owner', type: Exonum::StringT.new}, { name: 'balance', type: Exonum::UInt64T.new}]
5
+ fields = [
6
+ { name: 'pubkey', type: Exonum::PublicKeyT },
7
+ { name: 'owner', type: Exonum::StringT },
8
+ { name: 'balance', type: Exonum::UInt64T }
9
+ ]
6
10
  data = { 'pubkey' => '99ace6c721db293b0ed5b487e6d6111f22a8c55d2a1b7606b6fa6e6c29671aa1', 'owner' => 'Andrew', 'balance' => 1234 }
7
11
  buffer = SparseArray.new
8
12
  s = Exonum::StructT.new fields
@@ -11,7 +15,7 @@ RSpec.describe 'serialization' do
11
15
  end
12
16
 
13
17
  it "can serialize array" do
14
- a=Exonum::ArrayT.new Exonum::Int16T.new
18
+ a=Exonum::ArrayT.new Exonum::Int16T
15
19
  buffer = SparseArray.new
16
20
  a.serialize [1,2,3], buffer
17
21
  expect(buffer.serialize.pack('c*').unpack('H*').first).to eq("0000000003000000010002000300")
@@ -22,9 +26,9 @@ RSpec.describe 'serialization' do
22
26
  signature = "46386a5ef9ad0ac5d1e2fe509e3e3bfa27f4f0d376628169df76b5c02f77f8699ed966031a42bbc1a94002c4ec666f4e7d143a481e19eee306a2dfd8280c3d0e"
23
27
 
24
28
  fields = [
25
- { name: 'pub_key', type: Exonum::PublicKeyT.new },
26
- { name: 'amount', type: Exonum::UInt64T.new },
27
- { name: 'seed', type: Exonum::UInt64T.new }
29
+ { name: 'pub_key', type: Exonum::PublicKeyT },
30
+ { name: 'amount', type: Exonum::UInt64T },
31
+ { name: 'seed', type: Exonum::UInt64T }
28
32
  ]
29
33
  data = {
30
34
  'pub_key' => "29823166d18e2471a19b16d261fe329f1228048846c1acea2f370e6a89c7a4d9",
@@ -36,6 +40,15 @@ RSpec.describe 'serialization' do
36
40
  end
37
41
 
38
42
  it "can generate seed" do
39
- expect(Exonum.generate_seed.is_a? Integer).to be true
43
+ expect(Exonum::Random.generate_seed.is_a? Integer).to be true
44
+ end
45
+
46
+ it "can generate keypair" do
47
+ keypair = Exonum::Random.generate_keypair
48
+ data = 'test'
49
+ signing_key = Ed25519::SigningKey.new [keypair[:private]].pack('H*')
50
+ verify_key = Ed25519::VerifyKey.new [keypair[:public]].pack('H*')
51
+ signature = signing_key.sign data
52
+ expect(verify_key.verify signature, data).to be true
40
53
  end
41
54
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exonum-client-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuri Gomozov
@@ -83,7 +83,7 @@ files:
83
83
  - lib/exonum/types/message.rb
84
84
  - lib/exonum/types/primitive.rb
85
85
  - lib/exonum/types/struct.rb
86
- - lib/exonum/util/seed.rb
86
+ - lib/exonum/util/random.rb
87
87
  - lib/exonum/util/sparse_array.rb
88
88
  - lib/exonum/version.rb
89
89
  - spec/serialization_spec.rb
@@ -1,5 +0,0 @@
1
- module Exonum
2
- def self.generate_seed
3
- SecureRandom.random_bytes(16).unpack('Q<').first
4
- end
5
- end