beowulf-ruby 0.0.1

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.
@@ -0,0 +1,4 @@
1
+ module Beowulf
2
+ VERSION = '0.0.1'
3
+ AGENT_ID = "beowulf/#{VERSION}"
4
+ end
@@ -0,0 +1,186 @@
1
+ require 'bitcoin'
2
+ require 'digest'
3
+ require 'base58'
4
+ require 'json'
5
+
6
+ module Beowulf
7
+ class Wallet
8
+ include ChainConfig
9
+ include Utils
10
+
11
+ def initialize(options = {})
12
+ @name = options[:name] || ''
13
+ @private_key = options[:private_key] || ''
14
+ @public_key = options[:public_key] || ''
15
+ @cipher_keys = options[:cipher_keys] || ''
16
+ @cipher_type = 'aes-256-cbc'
17
+ @salt = options[:salt] || ''
18
+ end
19
+
20
+ def name
21
+ @name
22
+ end
23
+
24
+ def private_key
25
+ @private_key
26
+ end
27
+
28
+ def public_key
29
+ @public_key
30
+ end
31
+
32
+ def gen_keys
33
+ @private_key = gen_priv
34
+ @public_key = gen_pub
35
+ end
36
+
37
+ def gen_priv
38
+ rd = SecureRandom.alphanumeric(128)
39
+ seed = @name + "owner" + rd
40
+ bytes = pakStr(seed)
41
+ hashSha256 = Digest::SHA256.digest(bytes)
42
+ # create checksum
43
+ pk = unhexlify('80')
44
+ pk << hashSha256
45
+ chs = Digest::SHA256.digest(pk)
46
+ chs = Digest::SHA256.digest(chs)
47
+ # create private key.
48
+ b58 = pk
49
+ b58 << chs[0..3]
50
+ priv_key = Base58.binary_to_base58(b58, :bitcoin)
51
+ priv_key
52
+ end
53
+
54
+ def gen_pub
55
+ if @private_key.length > 0
56
+ b58 = Base58.base58_to_binary(@private_key, :bitcoin)
57
+ # Get checksum 4-bytes end.
58
+ lb58 = b58.length-4
59
+ chs = b58[lb58..-1]
60
+ # Get raw private key
61
+ hb58 = lb58-1
62
+ tpk = b58[0..hb58]
63
+ # Test checksum private key
64
+ nchs = Digest::SHA256.digest(tpk)
65
+ nchs = Digest::SHA256.digest(nchs)
66
+ achs = hexlify(chs)
67
+ bnchs = hexlify(nchs[0..3])
68
+ if !(achs.eql? bnchs)
69
+ puts achs, bnchs
70
+ puts 'Invalid private key (checksum miss-match)'
71
+ end
72
+ # Create Public Key
73
+ bk = Bitcoin::Key.new(hexlify(tpk[1..-1]), nil, {compressed: true})
74
+ public_key_hex = bk.pub
75
+ public_key_byte = unhexlify(public_key_hex)
76
+ checksum = OpenSSL::Digest::RIPEMD160.digest(public_key_byte)
77
+ public_key = NETWORKS_BEOWULF_ADDRESS_PREFIX + Base58.binary_to_base58(public_key_byte + checksum[0..3], :bitcoin)
78
+ public_key
79
+ end
80
+ end
81
+
82
+ def save_wallet_file(wallet_path, wallet_filename, password)
83
+ # Validate
84
+ if password == nil || password.length == 0
85
+ puts "Password is not empty."
86
+ end
87
+ if password.length < 8
88
+ puts "Password length >= 8 character."
89
+ end
90
+ if @name == nil || @name.length == 0
91
+ puts "name is not empty."
92
+ end
93
+
94
+ # Encrypt data
95
+ # Create checksum
96
+ @salt = SecureRandom.alphanumeric(16)
97
+ new_password = password + @salt
98
+ pw_bytes = pakStr(new_password)
99
+ checksum = Digest::SHA512.digest(pw_bytes)
100
+ chs = hexlify(checksum)
101
+ # Create plain_data
102
+ keys = {@public_key => @private_key}
103
+ plain_keys = {"checksum" => chs, "keys" => keys}
104
+ plain_data = JSON.dump(plain_keys)
105
+
106
+ # Encrypt AES
107
+ msg_encrypt = encrypt(chs, plain_data)
108
+ msg_hex = hexlify(msg_encrypt)
109
+ @cipher_keys = msg_hex
110
+
111
+ # Write file
112
+ file_path = wallet_filename
113
+ if wallet_filename.length == 0
114
+ file_path = @name + "-wallet.json"
115
+ end
116
+ if wallet_path.length > 0
117
+ file_path = File.join(wallet_path, file_path)
118
+ end
119
+ # Create data save.
120
+ wallet_data = {"cipher_keys" => @cipher_keys, "cipher_type" => @cipher_type, "salt" => @salt, "name" => @name}
121
+ wallet_json = JSON.dump(wallet_data)
122
+ File.open(file_path, "w") { |file| file.puts wallet_json}
123
+ end
124
+
125
+ # https://gist.github.com/andrekandore/3140554
126
+ def encrypt(key, data)
127
+ block = key[0..31]
128
+ aes = OpenSSL::Cipher.new('AES-256-CBC')
129
+ aes.encrypt
130
+ last = 31 + aes.block_size
131
+ aes.iv = key[32..last]
132
+ aes.key = block
133
+ final_msg = aes.update(data) + aes.final
134
+ final_msg
135
+ end
136
+
137
+ def read_wallet_file(wallet_path_file, password)
138
+ # Validate inputs
139
+ if wallet_path_file == nil || wallet_path_file.length == 0
140
+ puts "Path file wallet is not empty."
141
+ end
142
+ if password == nil || password.length == 0
143
+ puts "Password is not empty."
144
+ end
145
+ # Read file wallet
146
+ file = File.read(wallet_path_file)
147
+ wallet_json = JSON.parse(file)
148
+ # Init properties wallet
149
+ @name = wallet_json['name']
150
+ @cipher_keys = wallet_json['cipher_keys']
151
+ @salt = wallet_json['salt']
152
+ # Create checksum
153
+ new_password = password + @salt
154
+ pw_bytes = pakStr(new_password)
155
+ checksum = Digest::SHA512.digest(pw_bytes)
156
+ chs = hexlify(checksum)
157
+ # Decrypt data
158
+ data_byte = unhexlify(@cipher_keys)
159
+ # Decrypt AES
160
+ msg_decrypt = decrypt(chs, data_byte)
161
+ msg_json = JSON.parse(msg_decrypt)
162
+ dechs = msg_json['checksum']
163
+ if !(chs.eql? dechs)
164
+ puts "Password wrong."
165
+ end
166
+ keys = msg_json['keys']
167
+ keys.each do |key, value|
168
+ @public_key = key
169
+ @private_key = value
170
+ end
171
+ end
172
+
173
+ # https://gist.github.com/andrekandore/3140554
174
+ def decrypt(key, data)
175
+ block = key[0..31]
176
+ aes = OpenSSL::Cipher.new('AES-256-CBC')
177
+ aes.decrypt
178
+ last = 31 + aes.block_size
179
+ aes.iv = key[32..last]
180
+ aes.key = block
181
+ final_msg = aes.update(data) + aes.final
182
+ final_msg
183
+ end
184
+
185
+ end
186
+ end
metadata ADDED
@@ -0,0 +1,463 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: beowulf-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - NghiaTC
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-02-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.1
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.0.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '12.1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 12.1.0
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '12.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 12.1.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: minitest
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '5.10'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 5.10.3
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '5.10'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 5.10.3
73
+ - !ruby/object:Gem::Dependency
74
+ name: minitest-line
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: 0.6.3
80
+ type: :development
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: 0.6.3
87
+ - !ruby/object:Gem::Dependency
88
+ name: minitest-proveit
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '1.0'
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.0
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 1.0.0
107
+ - !ruby/object:Gem::Dependency
108
+ name: webmock
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '3.6'
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 3.6.0
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.6'
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 3.6.0
127
+ - !ruby/object:Gem::Dependency
128
+ name: simplecov
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: 0.17.0
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: 0.17.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: vcr
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '5.0'
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: 5.0.0
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '5.0'
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: 5.0.0
161
+ - !ruby/object:Gem::Dependency
162
+ name: yard
163
+ requirement: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 0.9.20
168
+ type: :development
169
+ prerelease: false
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: 0.9.20
175
+ - !ruby/object:Gem::Dependency
176
+ name: pry
177
+ requirement: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '0.11'
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: 0.11.3
185
+ type: :development
186
+ prerelease: false
187
+ version_requirements: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - "~>"
190
+ - !ruby/object:Gem::Version
191
+ version: '0.11'
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: 0.11.3
195
+ - !ruby/object:Gem::Dependency
196
+ name: rb-readline
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.5'
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: 0.5.5
205
+ type: :development
206
+ prerelease: false
207
+ version_requirements: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - "~>"
210
+ - !ruby/object:Gem::Version
211
+ version: '0.5'
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: 0.5.5
215
+ - !ruby/object:Gem::Dependency
216
+ name: irb
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '1.0'
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: 1.0.0
225
+ type: :development
226
+ prerelease: false
227
+ version_requirements: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - "~>"
230
+ - !ruby/object:Gem::Version
231
+ version: '1.0'
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: 1.0.0
235
+ - !ruby/object:Gem::Dependency
236
+ name: net-http-persistent
237
+ requirement: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - "~>"
240
+ - !ruby/object:Gem::Version
241
+ version: '2.5'
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: 2.5.2
245
+ type: :runtime
246
+ prerelease: false
247
+ version_requirements: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - "~>"
250
+ - !ruby/object:Gem::Version
251
+ version: '2.5'
252
+ - - ">="
253
+ - !ruby/object:Gem::Version
254
+ version: 2.5.2
255
+ - !ruby/object:Gem::Dependency
256
+ name: json
257
+ requirement: !ruby/object:Gem::Requirement
258
+ requirements:
259
+ - - "~>"
260
+ - !ruby/object:Gem::Version
261
+ version: '2.0'
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: 2.0.2
265
+ type: :runtime
266
+ prerelease: false
267
+ version_requirements: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '2.0'
272
+ - - ">="
273
+ - !ruby/object:Gem::Version
274
+ version: 2.0.2
275
+ - !ruby/object:Gem::Dependency
276
+ name: logging
277
+ requirement: !ruby/object:Gem::Requirement
278
+ requirements:
279
+ - - "~>"
280
+ - !ruby/object:Gem::Version
281
+ version: '2.2'
282
+ - - ">="
283
+ - !ruby/object:Gem::Version
284
+ version: 2.2.0
285
+ type: :runtime
286
+ prerelease: false
287
+ version_requirements: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - "~>"
290
+ - !ruby/object:Gem::Version
291
+ version: '2.2'
292
+ - - ">="
293
+ - !ruby/object:Gem::Version
294
+ version: 2.2.0
295
+ - !ruby/object:Gem::Dependency
296
+ name: hashie
297
+ requirement: !ruby/object:Gem::Requirement
298
+ requirements:
299
+ - - "~>"
300
+ - !ruby/object:Gem::Version
301
+ version: '3.5'
302
+ - - ">="
303
+ - !ruby/object:Gem::Version
304
+ version: 3.5.5
305
+ type: :runtime
306
+ prerelease: false
307
+ version_requirements: !ruby/object:Gem::Requirement
308
+ requirements:
309
+ - - "~>"
310
+ - !ruby/object:Gem::Version
311
+ version: '3.5'
312
+ - - ">="
313
+ - !ruby/object:Gem::Version
314
+ version: 3.5.5
315
+ - !ruby/object:Gem::Dependency
316
+ name: bitcoin-ruby
317
+ requirement: !ruby/object:Gem::Requirement
318
+ requirements:
319
+ - - "~>"
320
+ - !ruby/object:Gem::Version
321
+ version: '0.0'
322
+ - - ">="
323
+ - !ruby/object:Gem::Version
324
+ version: 0.0.11
325
+ type: :runtime
326
+ prerelease: false
327
+ version_requirements: !ruby/object:Gem::Requirement
328
+ requirements:
329
+ - - "~>"
330
+ - !ruby/object:Gem::Version
331
+ version: '0.0'
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: 0.0.11
335
+ - !ruby/object:Gem::Dependency
336
+ name: ffi
337
+ requirement: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - "~>"
340
+ - !ruby/object:Gem::Version
341
+ version: '1.9'
342
+ - - ">="
343
+ - !ruby/object:Gem::Version
344
+ version: 1.9.18
345
+ type: :runtime
346
+ prerelease: false
347
+ version_requirements: !ruby/object:Gem::Requirement
348
+ requirements:
349
+ - - "~>"
350
+ - !ruby/object:Gem::Version
351
+ version: '1.9'
352
+ - - ">="
353
+ - !ruby/object:Gem::Version
354
+ version: 1.9.18
355
+ - !ruby/object:Gem::Dependency
356
+ name: awesome_print
357
+ requirement: !ruby/object:Gem::Requirement
358
+ requirements:
359
+ - - "~>"
360
+ - !ruby/object:Gem::Version
361
+ version: '1.7'
362
+ - - ">="
363
+ - !ruby/object:Gem::Version
364
+ version: 1.7.0
365
+ type: :runtime
366
+ prerelease: false
367
+ version_requirements: !ruby/object:Gem::Requirement
368
+ requirements:
369
+ - - "~>"
370
+ - !ruby/object:Gem::Version
371
+ version: '1.7'
372
+ - - ">="
373
+ - !ruby/object:Gem::Version
374
+ version: 1.7.0
375
+ - !ruby/object:Gem::Dependency
376
+ name: base58
377
+ requirement: !ruby/object:Gem::Requirement
378
+ requirements:
379
+ - - "~>"
380
+ - !ruby/object:Gem::Version
381
+ version: '0.2'
382
+ - - ">="
383
+ - !ruby/object:Gem::Version
384
+ version: 0.2.3
385
+ type: :runtime
386
+ prerelease: false
387
+ version_requirements: !ruby/object:Gem::Requirement
388
+ requirements:
389
+ - - "~>"
390
+ - !ruby/object:Gem::Version
391
+ version: '0.2'
392
+ - - ">="
393
+ - !ruby/object:Gem::Version
394
+ version: 0.2.3
395
+ description: Beowulf-ruby is the official Beowulf library for Ruby.
396
+ email:
397
+ - contact@beowulfchain.com
398
+ executables: []
399
+ extensions: []
400
+ extra_rdoc_files: []
401
+ files:
402
+ - ".gitignore"
403
+ - Gemfile
404
+ - LICENSE
405
+ - README.md
406
+ - Rakefile
407
+ - beowulf.gemspec
408
+ - lib/beowulf.rb
409
+ - lib/beowulf/account_history_api.rb
410
+ - lib/beowulf/api.rb
411
+ - lib/beowulf/base_error.rb
412
+ - lib/beowulf/block_api.rb
413
+ - lib/beowulf/broadcast_operations.json
414
+ - lib/beowulf/chain_config.rb
415
+ - lib/beowulf/condenser_api.rb
416
+ - lib/beowulf/database_api.rb
417
+ - lib/beowulf/error_parser.rb
418
+ - lib/beowulf/logger.rb
419
+ - lib/beowulf/methods.json
420
+ - lib/beowulf/network_broadcast_api.rb
421
+ - lib/beowulf/operation.rb
422
+ - lib/beowulf/operation_ids.rb
423
+ - lib/beowulf/operation_types.rb
424
+ - lib/beowulf/transaction.rb
425
+ - lib/beowulf/type/amount.rb
426
+ - lib/beowulf/type/array.rb
427
+ - lib/beowulf/type/authority.rb
428
+ - lib/beowulf/type/authority_update.rb
429
+ - lib/beowulf/type/future.rb
430
+ - lib/beowulf/type/hash.rb
431
+ - lib/beowulf/type/permission.rb
432
+ - lib/beowulf/type/point_in_time.rb
433
+ - lib/beowulf/type/public_key.rb
434
+ - lib/beowulf/type/serializer.rb
435
+ - lib/beowulf/type/u_int16.rb
436
+ - lib/beowulf/type/u_int32.rb
437
+ - lib/beowulf/utils.rb
438
+ - lib/beowulf/version.rb
439
+ - lib/beowulf/wallet.rb
440
+ homepage: https://github.com/beowulf-foundation/beowulf-ruby
441
+ licenses:
442
+ - MIT
443
+ metadata: {}
444
+ post_install_message:
445
+ rdoc_options: []
446
+ require_paths:
447
+ - lib
448
+ required_ruby_version: !ruby/object:Gem::Requirement
449
+ requirements:
450
+ - - ">="
451
+ - !ruby/object:Gem::Version
452
+ version: '0'
453
+ required_rubygems_version: !ruby/object:Gem::Requirement
454
+ requirements:
455
+ - - ">="
456
+ - !ruby/object:Gem::Version
457
+ version: '0'
458
+ requirements: []
459
+ rubygems_version: 3.1.2
460
+ signing_key:
461
+ specification_version: 4
462
+ summary: Beowulf RPC Ruby Client
463
+ test_files: []