vchain_client 1.0.34 → 1.0.35

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 893c39ca202c6580ddf340cabde948b5d6d0c4f2
4
- data.tar.gz: 8deb77713e871f50dedb10a2bce6fbf80e1f95ca
3
+ metadata.gz: e923e1b7f09ce1695959a48bc2fb935989b4e6fe
4
+ data.tar.gz: dd38c906da6bff58071e6879af626f0f65c36388
5
5
  SHA512:
6
- metadata.gz: e09f53202548e50ddac690ba1c6b87ba7fc346360997dff3f433f8992d8e82bef82602cc193168548e5aec6befcd220932814d1a2053f098f98de98bc9aadfc9
7
- data.tar.gz: de4c07dce7135ae1823569730e8c7b976c6c97f9562cd4970eacb47d8c05a512109dc2a422a56d68b9ae846e5ab4e056dd708358a76d630afd156f9d152b0e3b
6
+ metadata.gz: a640e3c3a874a8008dfc487c6fb7174ff5828b9726e49bd3c6cc71ae5f89c46f01e71e35a6e0e9cfafe608e69639ce8aecfc8445745895aced391ae236abe8f2
7
+ data.tar.gz: 3729bd6925665b03666ae2837dde05f6ff1e3f72fedc133f495a000aa42e7e52b6a0e9cde0fb56f6288b37a358f75c9483bf01765a3f271ba69932557f68b2ce
@@ -131,10 +131,10 @@ module VChainClient
131
131
  return false
132
132
  end
133
133
 
134
- signaturesHelper = VChainClient::Signatures.new(@config)
134
+ cryptoHelper = VChainClient::Crypto.new(@config)
135
135
 
136
136
  if @log.debug?
137
- @log.debug("[Blockstack.checkBlockstackRecord] Signatures initialized")
137
+ @log.debug("[Blockstack.checkBlockstackRecord] Crypto initialized")
138
138
  end
139
139
 
140
140
  if record != nil
@@ -238,12 +238,17 @@ module VChainClient
238
238
  return false
239
239
  end
240
240
 
241
- # check client's sig
241
+ # check client's sig version 1
242
+ client_sig = record["client_sig"]
243
+
244
+ validator_sig = record["validator_sig"]
245
+
242
246
  client_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["ecc_pubkey"] + record["sig_version"];
243
247
 
244
248
  validator_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["ecc_pubkey"] + record["sig_version"] + record["validator_vchain_id"] + validator_blockstack_id
245
249
 
246
- if record["sig_version"] != "1"
250
+ # client's sig versions 2 && 3
251
+ if record["sig_version"] == "2" || record["sig_version"] == "3"
247
252
 
248
253
  # need to retrieve RSA key
249
254
  if !record.key?("rsa_pubkey")
@@ -256,19 +261,38 @@ module VChainClient
256
261
  return false
257
262
  end
258
263
 
259
- client_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["ecc_pubkey"] + record["rsa_pubkey"] + record["sig_version"];
264
+ if record["sig_version"] == "2"
265
+ # sig version 2
266
+
267
+ client_sig = record["client_sig_v2"]
268
+
269
+ validator_sig = record["validator_sig_v2"]
270
+
271
+ client_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["ecc_pubkey"] + record["rsa_pubkey"] + record["sig_version"];
272
+
273
+ validator_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["ecc_pubkey"].gsub(/\n/, "") + record["rsa_pubkey"].gsub(/\n/, "") + record["sig_version"] + record["validator_vchain_id"] + validator_blockstack_id
260
274
 
261
- validator_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["ecc_pubkey"].gsub(/\n/, "") + record["rsa_pubkey"].gsub(/\n/, "") + record["sig_version"] + record["validator_vchain_id"] + validator_blockstack_id
275
+ elsif record["sig_version"] == "3"
276
+ # sig version 3
277
+
278
+ client_sig = record["client_sig_v3"]
279
+
280
+ validator_sig = record["validator_sig_v3"]
281
+
282
+ client_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["ecc_pubkey"].gsub(/\n/, "") + record["rsa_pubkey"].gsub(/\n/, "") + record["sig_version"];
283
+
284
+ validator_sig_to_check = record["vchain_id"] + record["vchain_role"] + blockstack_id + record["ecc_pubkey"].gsub(/\n/, "") + record["rsa_pubkey"].gsub(/\n/, "") + record["sig_version"] + record["validator_vchain_id"] + validator_blockstack_id
285
+ end
262
286
  end
263
287
 
264
288
  begin
265
289
 
266
- if signaturesHelper.verifySignature(client_sig_to_check, record["client_sig"], record["ecc_pubkey"])
290
+ if cryptoHelper.verifySignature(client_sig_to_check, client_sig, record["ecc_pubkey"])
267
291
 
268
292
  # check validator's sig
269
293
  begin
270
294
 
271
- if signaturesHelper.verifySignature(validator_sig_to_check, record["validator_sig"], validator_ecc_pub_key)
295
+ if cryptoHelper.verifySignature(validator_sig_to_check, validator_sig, validator_ecc_pub_key)
272
296
 
273
297
  return true;
274
298
 
@@ -556,7 +580,7 @@ module VChainClient
556
580
  recs = line.split(" ")
557
581
 
558
582
  if recs.size == 3
559
- if recs[0] == "A1" || recs[0] == "A2" || recs[0] == "A3" || recs[0] == "A4" || recs[0] == "A5" || recs[0] == "A6" || recs[0] == "A7" || recs[0] == "A8" || recs[0] == "A9"
583
+ if recs[0] == "A1" || recs[0] == "A2" || recs[0] == "A3" || recs[0] == "A4" || recs[0] == "A5" || recs[0] == "A6" || recs[0] == "A7" || recs[0] == "A8" || recs[0] == "A9" || recs[0] == "A10" || recs[0] == "A11"
560
584
  fz[recs[0]] = recs[2][1..-2]
561
585
  end
562
586
  end
@@ -573,13 +597,13 @@ module VChainClient
573
597
  ecc_pubkey = ecc_pubkey_aligned[0..63] +"\n"+ ecc_pubkey_aligned[64..ecc_pubkey_aligned.length]
574
598
 
575
599
  rsa_pubkey = nil
576
- if fz["A7"] != "1"
600
+ if fz["A7"] == "2" || fz["A7"] == "3"
601
+ # sig versions 2 && 3
577
602
 
578
603
  if !fz.key?("A9")
579
604
  if @log.error?
580
605
  @log.error("[Blockstack.getBlockstackRecord] no 'A9' field, sig ver is >1")
581
606
  @log.error("-> blockstack_id: #{blockstack_id}")
582
- @log.error("--> blockstack_id: #{blockstack_id}")
583
607
  end
584
608
 
585
609
  return nil
@@ -601,6 +625,31 @@ module VChainClient
601
625
  "client_sig" => Base64.decode64(fz["A8"])
602
626
  }
603
627
 
628
+ if fz["A7"] == "2" || fz["A7"] == "3"
629
+ # sig versions 2 && 3
630
+
631
+ output["client_sig_v2"] = Base64.decode64(fz["A8"])
632
+ output["validator_sig_v2"] = Base64.decode64(fz["A3"])
633
+
634
+ if fz["A7"] == "3"
635
+ # sig version 3
636
+
637
+ if !fz.key?("A10") || !fz.key?("A11")
638
+ if @log.error?
639
+ @log.error("[Blockstack.getBlockstackRecord] no 'A10' or 'A11' fields, sig ver = 3")
640
+ @log.error("-> blockstack_id: #{blockstack_id}")
641
+ end
642
+
643
+ return nil
644
+ end
645
+
646
+ output["client_sig_v3"] = Base64.decode64(fz["A10"])
647
+ output["validator_sig_v3"] = Base64.decode64(fz["A11"])
648
+
649
+ end
650
+
651
+ end
652
+
604
653
  if @log.debug?
605
654
  @log.debug("[Blockstack.getBlockstackRecord] output:")
606
655
  @log.debug(output)
@@ -1,12 +1,17 @@
1
1
  module VChainClient
2
2
 
3
- class Signatures
3
+ class Crypto
4
4
 
5
5
  @config = nil
6
6
  @log = nil
7
7
 
8
- @@priv_key = nil
9
- @@ec_priv = nil
8
+ @@ecc_private_key = nil
9
+ @@ec_ecc_private = nil
10
+
11
+ @@rsa_private_key = nil
12
+ @@ec_rsa_private = nil
13
+
14
+ @@vchain_rsa_public_key = nil
10
15
 
11
16
  def initialize(config)
12
17
  @config = config
@@ -14,28 +19,193 @@ module VChainClient
14
19
  @log = Log4r::Logger["vchain_client"]
15
20
  end
16
21
 
22
+ def getVChainPublicKeyRSA()
23
+
24
+ if @@vchain_rsa_public_key != nil
25
+ return @@vchain_rsa_public_key
26
+ end
27
+
28
+ blockstackClient = VChainClient::BlockstackClient.new(@config)
29
+
30
+ vchain_public_key_body = nil
31
+
32
+ begin
33
+
34
+ vchain_public_key_body = blockstackClient.getPublicKeyRSA("vchain_core_01.id")
35
+
36
+ rescue => e
37
+ if @log.error?
38
+ @log.error("[check] failed to retrieve vchain public RSA key from Blockstack")
39
+ @log.error("#{e.class}, #{e.message}")
40
+ end
41
+
42
+ raise e
43
+ end
44
+
45
+ if vchain_public_key_body == nil
46
+ if @log.error?
47
+ @log.error("[check] failed to retrieve vchain public RSA key from Blockstack")
48
+ end
49
+
50
+ return false
51
+ end
52
+
53
+ vchain_public_key_str = "-----BEGIN PUBLIC KEY-----\n"
54
+ vchain_public_key_str += vchain_public_key_body
55
+ vchain_public_key_str += "\n-----END PUBLIC KEY-----"
56
+
57
+ @@vchain_rsa_public_key = OpenSSL::PKey::RSA.new(vchain_public_key_str)
58
+
59
+ return @@vchain_rsa_public_key
60
+ end
61
+
62
+ def encodeRSA(payload)
63
+ vchain_public_key = self.getVChainPublicKeyRSA()
64
+
65
+ return vchain_public_key.public_encrypt(payload, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING)
66
+ end
67
+
68
+ def decodeRSA(encoded_data)
69
+
70
+ priv_key_path = @config["rsa_private_key_location"]
71
+
72
+ if @log.debug?
73
+ @log.debug("[Crypto.decodeRSA] input:")
74
+ @log.debug("-> key path: #{priv_key_path}")
75
+ @log.debug("-> input:")
76
+ @log.debug(encoded_data)
77
+ end
78
+
79
+ if @@rsa_private_key == nil
80
+
81
+ begin
82
+
83
+ @@rsa_private_key = File.read(priv_key_path)
84
+
85
+ rescue => e
86
+ if @log.error?
87
+ @log.error("[Crypto.decodeRSA] File.read raised exception:")
88
+ @log.error("#{e.class}, #{e.message}")
89
+ @log.error("--> priv_key_path: #{priv_key_path}")
90
+ @log.error("-> input:")
91
+ @log.error(encoded_data)
92
+ end
93
+
94
+ raise e
95
+ end
96
+
97
+ if @log.debug?
98
+ @log.debug("[Crypto.decodeRSA] priv key is loaded")
99
+ end
100
+
101
+ end
102
+
103
+ if @@rsa_private_key == nil
104
+ if @log.error?
105
+ @log.error("[Crypto.decodeRSA] failed to load private key")
106
+ @log.error("--> priv_key_path: #{priv_key_path}")
107
+ @log.error("-> input:")
108
+ @log.error(encoded_data)
109
+ end
110
+
111
+ return nil
112
+ end
113
+
114
+ if @@ec_rsa_private == nil
115
+
116
+ begin
117
+
118
+ @@ec_rsa_private = OpenSSL::PKey::RSA.new(@@rsa_private_key)
119
+
120
+ rescue => e
121
+ if @log.error?
122
+ @log.error("[Crypto.decodeRSA] OpenSSL::PKey::EC.new raised exception:")
123
+ @log.error("#{e.class}, #{e.message}")
124
+ @log.error("--> priv_key_path: #{priv_key_path}")
125
+ @log.error("-> input:")
126
+ @log.error(encoded_data)
127
+ end
128
+
129
+ raise e
130
+ end
131
+
132
+ if @log.debug?
133
+ @log.debug("[Crypto.decodeRSA] key initialized")
134
+ end
135
+
136
+ end
137
+
138
+ if @@ec_rsa_private == nil
139
+ if @log.error?
140
+ @log.error("[Crypto.decodeRSA] failed init EC key")
141
+ @log.error("--> priv_key_path: #{priv_key_path}")
142
+ @log.error("-> input:")
143
+ @log.error(encoded_data)
144
+ end
145
+
146
+ return nil
147
+ end
148
+
149
+ return @@ec_rsa_private.private_decrypt(encoded_data, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING)
150
+ end
151
+
152
+ def decodeCypher(encoded_payload, key, iv)
153
+
154
+ cifd = OpenSSL::Cipher.new('AES-256-CBC')
155
+
156
+ #cifd.padding = 0
157
+
158
+ cifd.decrypt
159
+
160
+ cifd.key = key
161
+ cifd.iv = iv
162
+
163
+ decoded = ''
164
+ decoded << cifd.update(encoded_payload)
165
+ decoded << cifd.final
166
+
167
+ return decoded
168
+ end
169
+
170
+ def encodeCypher(document)
171
+ cif = OpenSSL::Cipher.new('AES-256-CBC')
172
+
173
+ cif.encrypt
174
+
175
+ cif.key = key = cif.random_key
176
+ cif.iv = iv = cif.random_iv
177
+
178
+ out = {
179
+ "payload" => (cif.update(document) + cif.final),
180
+ "key" => key,
181
+ "iv" => iv
182
+ }
183
+
184
+ return out
185
+ end
186
+
17
187
  def signBatchRequest(batch, timestamp)
18
188
  OpenSSL::PKey::EC.send(:alias_method, :private?, :private_key?)
19
189
 
20
190
  priv_key_path = @config["ecc_private_key_location"]
21
191
 
22
192
  if @log.debug?
23
- @log.debug("[Signatures.signBatchRequest] input:")
193
+ @log.debug("[Crypto.signBatchRequest] input:")
24
194
  @log.debug("-> timestamp: "+ timestamp.to_s)
25
195
  @log.debug("-> key path: #{priv_key_path}")
26
196
  @log.debug("-> input:")
27
197
  @log.debug(batch)
28
198
  end
29
199
 
30
- if @@priv_key == nil
200
+ if @@ecc_private_key == nil
31
201
 
32
202
  begin
33
203
 
34
- @@priv_key = File.read(priv_key_path)
204
+ @@ecc_private_key = File.read(priv_key_path)
35
205
 
36
206
  rescue => e
37
207
  if @log.error?
38
- @log.error("[Signatures.signBatchRequest] File.read raised exception:")
208
+ @log.error("[Crypto.signBatchRequest] File.read raised exception:")
39
209
  @log.error("#{e.class}, #{e.message}")
40
210
  @log.error("-> timestamp: "+ timestamp.to_s)
41
211
  @log.error("--> priv_key_path: #{priv_key_path}")
@@ -47,14 +217,14 @@ module VChainClient
47
217
  end
48
218
 
49
219
  if @log.debug?
50
- @log.debug("[Signatures.signBatchRequest] priv key is loaded")
220
+ @log.debug("[Crypto.signBatchRequest] priv key is loaded")
51
221
  end
52
222
 
53
223
  end
54
224
 
55
- if @@priv_key == nil
225
+ if @@ecc_private_key == nil
56
226
  if @log.error?
57
- @log.error("[Signatures.signBatchRequest] failed to load private key")
227
+ @log.error("[Crypto.signBatchRequest] failed to load private key")
58
228
  @log.error("-> timestamp: "+ timestamp.to_s)
59
229
  @log.error("--> priv_key_path: #{priv_key_path}")
60
230
  @log.error("-> input:")
@@ -64,15 +234,15 @@ module VChainClient
64
234
  return nil
65
235
  end
66
236
 
67
- if @@ec_priv == nil
237
+ if @@ec_ecc_private == nil
68
238
 
69
239
  begin
70
240
 
71
- @@ec_priv = OpenSSL::PKey::EC.new(@@priv_key)
241
+ @@ec_ecc_private = OpenSSL::PKey::EC.new(@@ecc_private_key)
72
242
 
73
243
  rescue => e
74
244
  if @log.error?
75
- @log.error("[Signatures.signBatchRequest] OpenSSL::PKey::EC.new raised exception:")
245
+ @log.error("[Crypto.signBatchRequest] OpenSSL::PKey::EC.new raised exception:")
76
246
  @log.error("#{e.class}, #{e.message}")
77
247
  @log.error("-> timestamp: "+ timestamp.to_s)
78
248
  @log.error("--> priv_key_path: #{priv_key_path}")
@@ -84,14 +254,14 @@ module VChainClient
84
254
  end
85
255
 
86
256
  if @log.debug?
87
- @log.debug("[Signatures.signBatchRequest] key initialized")
257
+ @log.debug("[Crypto.signBatchRequest] key initialized")
88
258
  end
89
259
 
90
260
  end
91
261
 
92
- if @@ec_priv == nil
262
+ if @@ec_ecc_private == nil
93
263
  if @log.error?
94
- @log.error("[Signatures.signBatchRequest] failed init EC key")
264
+ @log.error("[Crypto.signBatchRequest] failed init EC key")
95
265
  @log.error("-> timestamp: "+ timestamp.to_s)
96
266
  @log.error("--> priv_key_path: #{priv_key_path}")
97
267
  @log.error("-> input:")
@@ -113,18 +283,18 @@ module VChainClient
113
283
  }
114
284
 
115
285
  if @log.debug?
116
- @log.debug("[Signatures.signBatchRequest] whole_to_sign: "+ whole_sign)
286
+ @log.debug("[Crypto.signBatchRequest] whole_to_sign: "+ whole_sign)
117
287
  end
118
288
 
119
289
  whole_signature = nil
120
290
 
121
291
  begin
122
292
 
123
- whole_signature = @@ec_priv.sign(digest, whole_sign)
293
+ whole_signature = @@ec_ecc_private.sign(digest, whole_sign)
124
294
 
125
295
  rescue => e
126
296
  if @log.error?
127
- @log.error("[Signatures.signBatchRequest] ec.sign raised exception:")
297
+ @log.error("[Crypto.signBatchRequest] ec.sign raised exception:")
128
298
  @log.error("#{e.class}, #{e.message}")
129
299
  @log.error("-> timestamp: "+ timestamp.to_s)
130
300
  @log.error("--> priv_key_path: #{priv_key_path}")
@@ -138,7 +308,7 @@ module VChainClient
138
308
 
139
309
  if whole_signature == nil
140
310
  if @log.error?
141
- @log.error("[Signatures.signBatchRequest] failed to sign")
311
+ @log.error("[Crypto.signBatchRequest] failed to sign")
142
312
  @log.error("-> timestamp: "+ timestamp.to_s)
143
313
  @log.error("--> priv_key_path: #{priv_key_path}")
144
314
  @log.error("--> whole_sign: #{whole_sign}")
@@ -150,7 +320,7 @@ module VChainClient
150
320
  end
151
321
 
152
322
  if @log.debug?
153
- @log.debug("[Signatures.signBatchRequest] whole_signature raw: "+ Base64.encode64(whole_signature))
323
+ @log.debug("[Crypto.signBatchRequest] whole_signature raw: "+ Base64.encode64(whole_signature))
154
324
  end
155
325
 
156
326
  return Base64.encode64(whole_signature).gsub(/\n/, "")
@@ -163,7 +333,7 @@ module VChainClient
163
333
  priv_key_path = @config["ecc_private_key_location"]
164
334
 
165
335
  if @log.debug?
166
- @log.debug("[Signatures.signRequest] input:")
336
+ @log.debug("[Crypto.signRequest] input:")
167
337
  @log.debug("-> point_type: "+ point_type)
168
338
  @log.debug("-> weight: "+ weight.to_s)
169
339
  @log.debug("-> timestamp: "+ timestamp.to_s)
@@ -172,15 +342,15 @@ module VChainClient
172
342
  @log.debug(document)
173
343
  end
174
344
 
175
- if @@priv_key == nil
345
+ if @@ecc_private_key == nil
176
346
 
177
347
  begin
178
348
 
179
- @@priv_key = File.read(priv_key_path)
349
+ @@ecc_private_key = File.read(priv_key_path)
180
350
 
181
351
  rescue => e
182
352
  if @log.error?
183
- @log.error("[Signatures.signRequest] File.read raised exception:")
353
+ @log.error("[Crypto.signRequest] File.read raised exception:")
184
354
  @log.error("#{e.class}, #{e.message}")
185
355
  @log.error("-> point_type: "+ point_type)
186
356
  @log.error("-> weight: "+ weight.to_s)
@@ -194,14 +364,14 @@ module VChainClient
194
364
  end
195
365
 
196
366
  if @log.debug?
197
- @log.debug("[Signatures.signRequest] priv key is loaded")
367
+ @log.debug("[Crypto.signRequest] priv key is loaded")
198
368
  end
199
369
 
200
370
  end
201
371
 
202
- if @@priv_key == nil
372
+ if @@ecc_private_key == nil
203
373
  if @log.error?
204
- @log.error("[Signatures.signRequest] failed to load private key")
374
+ @log.error("[Crypto.signRequest] failed to load private key")
205
375
  @log.error("-> point_type: "+ point_type)
206
376
  @log.error("-> weight: "+ weight.to_s)
207
377
  @log.error("-> timestamp: "+ timestamp.to_s)
@@ -213,15 +383,15 @@ module VChainClient
213
383
  return nil
214
384
  end
215
385
 
216
- if @@ec_priv == nil
386
+ if @@ec_ecc_private == nil
217
387
 
218
388
  begin
219
389
 
220
- @@ec_priv = OpenSSL::PKey::EC.new(@@priv_key)
390
+ @@ec_ecc_private = OpenSSL::PKey::EC.new(@@ecc_private_key)
221
391
 
222
392
  rescue => e
223
393
  if @log.error?
224
- @log.error("[Signatures.signRequest] OpenSSL::PKey::EC.new raised exception:")
394
+ @log.error("[Crypto.signRequest] OpenSSL::PKey::EC.new raised exception:")
225
395
  @log.error("#{e.class}, #{e.message}")
226
396
  @log.error("-> point_type: "+ point_type)
227
397
  @log.error("-> weight: "+ weight.to_s)
@@ -235,14 +405,14 @@ module VChainClient
235
405
  end
236
406
 
237
407
  if @log.debug?
238
- @log.debug("[Signatures.signRequest] key initialized")
408
+ @log.debug("[Crypto.signRequest] key initialized")
239
409
  end
240
410
 
241
411
  end
242
412
 
243
- if @@ec_priv == nil
413
+ if @@ec_ecc_private == nil
244
414
  if @log.error?
245
- @log.error("[Signatures.signRequest] failed init EC key")
415
+ @log.error("[Crypto.signRequest] failed init EC key")
246
416
  @log.error("-> point_type: "+ point_type)
247
417
  @log.error("-> weight: "+ weight.to_s)
248
418
  @log.error("-> timestamp: "+ timestamp.to_s)
@@ -259,18 +429,18 @@ module VChainClient
259
429
  whole_sign = document.to_json + point_type + weight.to_s + timestamp.to_s
260
430
 
261
431
  if @log.debug?
262
- @log.debug("[Signatures.signRequest] whole_to_sign: "+ whole_sign)
432
+ @log.debug("[Crypto.signRequest] whole_to_sign: "+ whole_sign)
263
433
  end
264
434
 
265
435
  whole_signature = nil
266
436
 
267
437
  begin
268
438
 
269
- whole_signature = @@ec_priv.sign(digest, whole_sign)
439
+ whole_signature = @@ec_ecc_private.sign(digest, whole_sign)
270
440
 
271
441
  rescue => e
272
442
  if @log.error?
273
- @log.error("[Signatures.signRequest] ec.sign raised exception:")
443
+ @log.error("[Crypto.signRequest] ec.sign raised exception:")
274
444
  @log.error("#{e.class}, #{e.message}")
275
445
  @log.error("-> point_type: "+ point_type)
276
446
  @log.error("-> weight: "+ weight.to_s)
@@ -286,7 +456,7 @@ module VChainClient
286
456
 
287
457
  if whole_signature == nil
288
458
  if @log.error?
289
- @log.error("[Signatures.signRequest] failed to sign")
459
+ @log.error("[Crypto.signRequest] failed to sign")
290
460
  @log.error("-> point_type: "+ point_type)
291
461
  @log.error("-> weight: "+ weight.to_s)
292
462
  @log.error("-> timestamp: "+ timestamp.to_s)
@@ -300,7 +470,7 @@ module VChainClient
300
470
  end
301
471
 
302
472
  if @log.debug?
303
- @log.debug("[Signatures.signRequest] whole_signature raw: "+ Base64.encode64(whole_signature))
473
+ @log.debug("[Crypto.signRequest] whole_signature raw: "+ Base64.encode64(whole_signature))
304
474
  end
305
475
 
306
476
  return Base64.encode64(whole_signature).gsub(/\n/, "")
@@ -319,7 +489,7 @@ module VChainClient
319
489
 
320
490
  rescue => e
321
491
  if @log.error?
322
- @log.error("[Signatures.verifySignature] OpenSSL::PKey::EC.new raised exception:")
492
+ @log.error("[Crypto.verifySignature] OpenSSL::PKey::EC.new raised exception:")
323
493
  @log.error("#{e.class}, #{e.message}")
324
494
  @log.error("-> what_to_check: #{what_to_check}")
325
495
  @log.error("-> signature: "+ Base64.encode64(signature))
@@ -333,7 +503,7 @@ module VChainClient
333
503
 
334
504
  if ec == nil
335
505
  if @log.error?
336
- @log.error("[Signatures.verifySignature] failed init EC key")
506
+ @log.error("[Crypto.verifySignature] failed init EC key")
337
507
  @log.error("-> what_to_check: #{what_to_check}")
338
508
  @log.error("-> signature: "+ Base64.encode64(signature))
339
509
  @log.error("-> public_key: "+ pub_key)
@@ -351,7 +521,7 @@ module VChainClient
351
521
 
352
522
  rescue => e
353
523
  if @log.error?
354
- @log.error("[Signatures.verifySignature] ec.verify raised exception:")
524
+ @log.error("[Crypto.verifySignature] ec.verify raised exception:")
355
525
  @log.error("#{e.class}, #{e.message}")
356
526
  @log.error("-> what_to_check: #{what_to_check}")
357
527
  @log.error("-> signature: "+ Base64.encode64(signature))
@@ -373,7 +543,7 @@ module VChainClient
373
543
  priv_key_path = @config["ecc_private_key_location"]
374
544
 
375
545
  if @log.debug?
376
- @log.debug("[Signatures.signDataPoint] input:")
546
+ @log.debug("[Crypto.signDataPoint] input:")
377
547
  @log.debug("-> this_client_id: #{this_client_id}")
378
548
  @log.debug("-> doc_hash: #{doc_hash}")
379
549
  @log.debug("-> credentials_hash: #{credentials_hash}")
@@ -385,15 +555,15 @@ module VChainClient
385
555
  @log.debug(data)
386
556
  end
387
557
 
388
- if @@priv_key == nil
558
+ if @@ecc_private_key == nil
389
559
 
390
560
  begin
391
561
 
392
- @@priv_key = File.read(priv_key_path)
562
+ @@ecc_private_key = File.read(priv_key_path)
393
563
 
394
564
  rescue => e
395
565
  if @log.error?
396
- @log.error("[Signatures.signDataPoint] File.read raised exception:")
566
+ @log.error("[Crypto.signDataPoint] File.read raised exception:")
397
567
  @log.error("#{e.class}, #{e.message}")
398
568
  @log.error("-> this_client_id: #{this_client_id}")
399
569
  @log.error("-> doc_hash: #{doc_hash}")
@@ -410,14 +580,14 @@ module VChainClient
410
580
  end
411
581
 
412
582
  if @log.debug?
413
- @log.debug("[Signatures.signDataPoint] priv key loaded")
583
+ @log.debug("[Crypto.signDataPoint] priv key loaded")
414
584
  end
415
585
 
416
586
  end
417
587
 
418
- if @@priv_key == nil
588
+ if @@ecc_private_key == nil
419
589
  if @log.error?
420
- @log.error("[Signatures.signDataPoint] failed to load private key")
590
+ @log.error("[Crypto.signDataPoint] failed to load private key")
421
591
  @log.error("-> this_client_id: #{this_client_id}")
422
592
  @log.error("-> doc_hash: #{doc_hash}")
423
593
  @log.error("-> credentials_hash: #{credentials_hash}")
@@ -432,15 +602,15 @@ module VChainClient
432
602
  return nil
433
603
  end
434
604
 
435
- if @@ec_priv == nil
605
+ if @@ec_ecc_private == nil
436
606
 
437
607
  begin
438
608
 
439
- @@ec_priv = OpenSSL::PKey::EC.new(@@priv_key)
609
+ @@ec_ecc_private = OpenSSL::PKey::EC.new(@@ecc_private_key)
440
610
 
441
611
  rescue => e
442
612
  if @log.error?
443
- @log.error("[Signatures.signDataPoint] OpenSSL::PKey::EC.new raised exception:")
613
+ @log.error("[Crypto.signDataPoint] OpenSSL::PKey::EC.new raised exception:")
444
614
  @log.error("#{e.class}, #{e.message}")
445
615
  @log.error("-> this_client_id: #{this_client_id}")
446
616
  @log.error("-> doc_hash: #{doc_hash}")
@@ -458,14 +628,14 @@ module VChainClient
458
628
  end
459
629
 
460
630
  if @log.debug?
461
- @log.debug("[Signatures.signDataPoint] key created")
631
+ @log.debug("[Crypto.signDataPoint] key created")
462
632
  end
463
633
 
464
634
  end
465
635
 
466
- if @@ec_priv == nil
636
+ if @@ec_ecc_private == nil
467
637
  if @log.error?
468
- @log.error("[Signatures.signDataPoint] failed init EC key")
638
+ @log.error("[Crypto.signDataPoint] failed init EC key")
469
639
  @log.error("-> this_client_id: #{this_client_id}")
470
640
  @log.error("-> doc_hash: #{doc_hash}")
471
641
  @log.error("-> credentials_hash: #{credentials_hash}")
@@ -490,7 +660,7 @@ module VChainClient
490
660
  value = rec[1]
491
661
 
492
662
  if @log.debug?
493
- @log.debug("[Signatures.signDataPoint] field: #{field}, value: #{value}")
663
+ @log.debug("[Crypto.signDataPoint] field: #{field}, value: #{value}")
494
664
  end
495
665
 
496
666
  if field != 'client_id'
@@ -510,19 +680,19 @@ module VChainClient
510
680
  what_to_sign += VChainClient::Client::DATA_POINT_VERSION
511
681
 
512
682
  if @log.debug?
513
- @log.debug("[Signatures.signDataPoint] field_hash: #{field_hash}")
514
- @log.debug("[Signatures.signDataPoint] value_hash: #{value_hash}")
683
+ @log.debug("[Crypto.signDataPoint] field_hash: #{field_hash}")
684
+ @log.debug("[Crypto.signDataPoint] value_hash: #{value_hash}")
515
685
  end
516
686
 
517
687
  signature = nil
518
688
 
519
689
  begin
520
690
 
521
- signature = @@ec_priv.sign(digest, what_to_sign)
691
+ signature = @@ec_ecc_private.sign(digest, what_to_sign)
522
692
 
523
693
  rescue => e
524
694
  if @log.error?
525
- @log.error("[Signatures.signDataPoint] ec.sign raised exception:")
695
+ @log.error("[Crypto.signDataPoint] ec.sign raised exception:")
526
696
  @log.error("#{e.class}, #{e.message}")
527
697
  @log.error("-> this_client_id: #{this_client_id}")
528
698
  @log.error("-> doc_hash: #{doc_hash}")
@@ -542,7 +712,7 @@ module VChainClient
542
712
 
543
713
  if signature == nil
544
714
  if @log.error?
545
- @log.error("[Signatures.signDataPoint] failed to sign")
715
+ @log.error("[Crypto.signDataPoint] failed to sign")
546
716
  @log.error("-> this_client_id: #{this_client_id}")
547
717
  @log.error("-> doc_hash: #{doc_hash}")
548
718
  @log.error("-> credentials_hash: #{credentials_hash}")
@@ -560,7 +730,7 @@ module VChainClient
560
730
  end
561
731
 
562
732
  if @log.debug?
563
- @log.debug("[Signatures.signDataPoint] signature raw: "+ Base64.encode64(signature))
733
+ @log.debug("[Crypto.signDataPoint] signature raw: "+ Base64.encode64(signature))
564
734
  end
565
735
 
566
736
  output[field] = Base64.encode64(signature).gsub(/\n/, "")
@@ -569,7 +739,7 @@ module VChainClient
569
739
  }
570
740
 
571
741
  if @log.debug?
572
- @log.debug("[Signatures.signDataPoint] output:")
742
+ @log.debug("[Crypto.signDataPoint] output:")
573
743
  @log.debug(output)
574
744
  end
575
745
 
@@ -586,7 +756,7 @@ module VChainClient
586
756
  what_to_check += sig_version
587
757
 
588
758
  if @log.debug?
589
- @log.debug("[Signatures.checkTreeSignature] input:")
759
+ @log.debug("[Crypto.checkTreeSignature] input:")
590
760
  @log.debug("-> tree_root_hash: #{tree_root_hash}")
591
761
  @log.debug("-> blockchain_txid: #{blockchain_txid}")
592
762
  @log.debug("-> blockchain_block_hash: #{blockchain_block_hash}")
@@ -603,7 +773,7 @@ module VChainClient
603
773
 
604
774
  rescue => e
605
775
  if @log.error?
606
- @log.error("[Signatures.checkTreeSignature] verifySignature raised exception:")
776
+ @log.error("[Crypto.checkTreeSignature] verifySignature raised exception:")
607
777
  @log.error("#{e.class}, #{e.message}")
608
778
  @log.error("-> tree_root_hash: #{tree_root_hash}")
609
779
  @log.error("-> blockchain_txid: #{blockchain_txid}")
@@ -625,7 +795,7 @@ module VChainClient
625
795
  def checkVerificationSignature(field_hash, data_hash, doc_hash, credentials_hash, verification_type, weight, timestamp, blockstack_client_id, pubkey, signature, version)
626
796
 
627
797
  if @log.debug?
628
- @log.debug("[Signatures.checkVerificationSignature] input:")
798
+ @log.debug("[Crypto.checkVerificationSignature] input:")
629
799
  @log.debug("-> field_hash: #{field_hash}")
630
800
  @log.debug("-> data_hash: #{data_hash}")
631
801
  @log.debug("-> doc_hash: #{doc_hash}")
@@ -654,7 +824,7 @@ module VChainClient
654
824
 
655
825
  rescue => e
656
826
  if @log.error?
657
- @log.error("[Signatures.checkVerificationSignature] verifySignature raised exception:")
827
+ @log.error("[Crypto.checkVerificationSignature] verifySignature raised exception:")
658
828
  @log.error("#{e.class}, #{e.message}")
659
829
  @log.error("-> field_hash: #{field_hash}")
660
830
  @log.error("-> data_hash: #{data_hash}")
data/lib/vchain_client.rb CHANGED
@@ -13,7 +13,7 @@ module VChainClient
13
13
  require 'vchain_client/blockcypher_blockchain_adapter'
14
14
  require 'vchain_client/blockchain_adapter_factory'
15
15
  require 'vchain_client/blockchain_connection'
16
- require 'vchain_client/signatures'
16
+ require 'vchain_client/crypto'
17
17
  require 'vchain_client/blockstack_client'
18
18
  require 'vchain_client/decision_algos/decision_algorithm.rb'
19
19
  require 'vchain_client/decision_algos/vector_based_decision_algorithm.rb'
@@ -26,7 +26,7 @@ module VChainClient
26
26
 
27
27
  DATA_POINT_VERSION = "1"
28
28
 
29
- CLIENT_LIB_VERSION = "1.0.32"
29
+ CLIENT_LIB_VERSION = "1.0.35"
30
30
 
31
31
  @config = nil
32
32
  @log = nil
@@ -176,6 +176,7 @@ module VChainClient
176
176
  end
177
177
 
178
178
  def self.get_credentials_hash(document)
179
+
179
180
  if document["type"] == FIELD_TYPE_TRAVEL_DOCUMENT_HASHED
180
181
  what_to_hash = document["type"] + document["number"] + document["given_names"] + document["surname"] + document["birthdate"]
181
182
 
@@ -320,7 +321,7 @@ module VChainClient
320
321
 
321
322
  def add_batch_data_points(input_arr)
322
323
 
323
- signaturesHelper = VChainClient::Signatures.new(@config)
324
+ cryptoHelper = VChainClient::Crypto.new(@config)
324
325
 
325
326
  time = Time.now.getutc
326
327
  timestamp = time.to_i
@@ -382,11 +383,11 @@ module VChainClient
382
383
 
383
384
  begin
384
385
 
385
- point_signatures = signaturesHelper.signDataPoint(point_type, hashed_document, doc_hash, credentials_hash, weight, timestamp)
386
+ point_signatures = cryptoHelper.signDataPoint(point_type, hashed_document, doc_hash, credentials_hash, weight, timestamp)
386
387
 
387
388
  rescue => e
388
389
  if @log.error?
389
- @log.error("[add_batch_data_points] Signatures.signDataPoint raised exception")
390
+ @log.error("[add_batch_data_points] Crypto.signDataPoint raised exception")
390
391
  @log.error("#{e.class}, #{e.message}")
391
392
  @log.error("-> point_type: "+ point_type)
392
393
  @log.error("-> weight: "+ weight.to_s)
@@ -400,7 +401,7 @@ module VChainClient
400
401
 
401
402
  if point_signatures == nil
402
403
  if @log.error?
403
- @log.error("[add_batch_data_points] failed to Signatures.signDataPoint")
404
+ @log.error("[add_batch_data_points] failed to Crypto.signDataPoint")
404
405
  @log.error("-> point_type: "+ point_type)
405
406
  @log.error("-> weight: "+ weight.to_s)
406
407
  @log.error("-> timestamp: "+ timestamp.to_s)
@@ -429,18 +430,18 @@ module VChainClient
429
430
  }
430
431
 
431
432
  client_id = @config["client_id"]
432
- api_url = @config["api"]["url"] + "v0.3/batchAddDataPoint/"
433
+ api_url = @config["api"]["url"] + "v0.4/batchAddDataPoint/"
433
434
 
434
435
  whole_signature = nil
435
436
 
436
437
  begin
437
438
 
438
- whole_signature = signaturesHelper.signBatchRequest(batch, timestamp)
439
+ whole_signature = cryptoHelper.signBatchRequest(batch, timestamp)
439
440
 
440
441
  rescue => e
441
442
 
442
443
  if @log.error?
443
- @log.error("[add_batch_data_points] Signatures.signRequest raised exception:")
444
+ @log.error("[add_batch_data_points] Crypto.signRequest raised exception:")
444
445
  @log.error("#{e.class}: #{e.message}")
445
446
  end
446
447
 
@@ -458,12 +459,11 @@ module VChainClient
458
459
  end
459
460
 
460
461
  if @log.debug?
461
- @log.debug("[add_batch_data_points] signaturesHelper.signRequest went well, whole_signature:")
462
+ @log.debug("[add_batch_data_points] Crypto.signRequest went well, whole_signature:")
462
463
  @log.debug(whole_signature)
463
464
  end
464
465
 
465
466
  send_data = {}
466
- send_data["client_id"] = client_id
467
467
  send_data["signature"] = whole_signature
468
468
  send_data["timestamp"] = timestamp.to_s
469
469
 
@@ -479,17 +479,32 @@ module VChainClient
479
479
 
480
480
  send_data["data"].push(send_doc)
481
481
  }
482
+
483
+ cyphered_data = cryptoHelper.encodeCypher(send_data.to_json)
484
+
485
+ encoded_key = cryptoHelper.encodeRSA(cyphered_data["key"])
486
+
487
+ encoded_iv = cryptoHelper.encodeRSA(cyphered_data["iv"])
488
+
489
+ doc_to_send = {
490
+ "key" => Base64.encode64(encoded_key),
491
+ "iv" => Base64.encode64(encoded_iv),
492
+ "payload" => Base64.encode64(cyphered_data["payload"]),
493
+ "client_id" => client_id
494
+ }
482
495
 
483
496
  if @log.debug?
484
- @log.debug("[add_batch_data_points] send_data:")
485
- @log.debug(send_data)
497
+ @log.debug("[add_batch_data_points] raw sent data:")
498
+ @log.debug(send_data.to_json)
499
+ @log.debug("[add_batch_data_points] sent data:")
500
+ @log.debug(doc_to_send)
486
501
  end
487
502
 
488
503
  begin
489
504
 
490
505
  res = RestClient::Resource.new api_url, :timeout => nil, :open_timeout => nil
491
506
 
492
- req = res.post send_data.to_json, :content_type => 'application/json'
507
+ req = res.post doc_to_send.to_json, :content_type => 'application/json'
493
508
 
494
509
  if req.code != 200
495
510
 
@@ -498,8 +513,10 @@ module VChainClient
498
513
  @log.error("-> client_id: #{client_id}")
499
514
  @log.error("-> api_url: #{api_url}")
500
515
  @log.error("-> timestamp: "+ timestamp.to_s)
501
- @log.error("-> send_data:")
516
+ @log.error("-> raw sent data:")
502
517
  @log.error(send_data)
518
+ @log.error("-> sent data:")
519
+ @log.error(doc_to_send)
503
520
  end
504
521
 
505
522
  return false
@@ -519,8 +536,10 @@ module VChainClient
519
536
  @log.error("-> client_id: #{client_id}")
520
537
  @log.error("-> api_url: #{api_url}")
521
538
  @log.error("-> timestamp: "+ timestamp.to_s)
522
- @log.error("-> send_data:")
539
+ @log.error("-> raw sent data:")
523
540
  @log.error(send_data)
541
+ @log.error("-> sent data:")
542
+ @log.error(doc_to_send)
524
543
  end
525
544
 
526
545
  raise e
@@ -533,7 +552,7 @@ module VChainClient
533
552
  def add_data_point(point_type, input, weight = 1)
534
553
 
535
554
  client_id = @config["client_id"]
536
- api_url = @config["api"]["url"] + "v0.3/addDataPoint/"
555
+ api_url = @config["api"]["url"] + "v0.4/addDataPoint/"
537
556
 
538
557
  time = Time.now.getutc
539
558
  timestamp = time.to_i
@@ -603,17 +622,17 @@ module VChainClient
603
622
  @log.debug(document)
604
623
  end
605
624
 
606
- signaturesHelper = VChainClient::Signatures.new(@config)
625
+ cryptoHelper = VChainClient::Crypto.new(@config)
607
626
 
608
627
  point_signatures = nil
609
628
 
610
629
  begin
611
630
 
612
- point_signatures = signaturesHelper.signDataPoint(point_type, document, doc_hash, credentials_hash, weight, timestamp)
631
+ point_signatures = cryptoHelper.signDataPoint(point_type, document, doc_hash, credentials_hash, weight, timestamp)
613
632
 
614
633
  rescue => e
615
634
  if @log.error?
616
- @log.error("[verify] Signatures.signDataPoint raised exception")
635
+ @log.error("[verify] Crypto.signDataPoint raised exception")
617
636
  @log.error("#{e.class}, #{e.message}")
618
637
  @log.error("-> point_type: "+ point_type)
619
638
  @log.error("-> weight: "+ weight.to_s)
@@ -629,7 +648,7 @@ module VChainClient
629
648
 
630
649
  if point_signatures == nil
631
650
  if @log.error?
632
- @log.error("[verify] failed to Signatures.signDataPoint")
651
+ @log.error("[verify] failed to Crypto.signDataPoint")
633
652
  @log.error("-> point_type: "+ point_type)
634
653
  @log.error("-> weight: "+ weight.to_s)
635
654
  @log.error("-> timestamp: "+ timestamp.to_s)
@@ -658,12 +677,12 @@ module VChainClient
658
677
 
659
678
  begin
660
679
 
661
- whole_signature = signaturesHelper.signRequest(document, point_type, weight, timestamp)
680
+ whole_signature = cryptoHelper.signRequest(document, point_type, weight, timestamp)
662
681
 
663
682
  rescue => e
664
683
 
665
684
  if @log.error?
666
- @log.error("[verify] Signatures.signRequest raised exception:")
685
+ @log.error("[verify] Crypto.signRequest raised exception:")
667
686
  @log.error("#{e.class}: #{e.message}")
668
687
  @log.error("-> point_type: #{point_type}")
669
688
  @log.error("-> weight: "+ weight.to_s)
@@ -695,14 +714,13 @@ module VChainClient
695
714
  end
696
715
 
697
716
  if @log.debug?
698
- @log.debug("[verify] signaturesHelper.signRequest went well, whole_signature:")
717
+ @log.debug("[verify] Crypto.signRequest went well, whole_signature:")
699
718
  @log.debug(whole_signature)
700
719
  end
701
720
 
702
721
  end
703
722
 
704
723
  send_data = {}
705
- send_data["client_id"] = client_id
706
724
  send_data["data"] = document
707
725
  send_data["weight"] = weight.to_s
708
726
  send_data["timestamp"] = timestamp.to_s
@@ -710,14 +728,27 @@ module VChainClient
710
728
  send_data["point_signatures"] = point_signatures
711
729
  send_data["signature"] = whole_signature
712
730
 
731
+ cyphered_data = cryptoHelper.encodeCypher(send_data.to_json)
732
+
733
+ encoded_key = cryptoHelper.encodeRSA(cyphered_data["key"])
734
+
735
+ encoded_iv = cryptoHelper.encodeRSA(cyphered_data["iv"])
736
+
737
+ doc_to_send = {
738
+ "key" => Base64.encode64(encoded_key),
739
+ "iv" => Base64.encode64(encoded_iv),
740
+ "payload" => Base64.encode64(cyphered_data["payload"]),
741
+ "client_id" => client_id
742
+ }
743
+
713
744
  if @log.debug?
714
745
  @log.debug("[verify] send_data:")
715
- @log.debug(send_data)
746
+ @log.debug(doc_to_send)
716
747
  end
717
748
 
718
749
  begin
719
750
  req = RestClient.post(api_url,
720
- send_data.to_json,
751
+ doc_to_send.to_json,
721
752
  {'Content-Type' => 'application/json'})
722
753
 
723
754
  if req.code != 200
@@ -729,8 +760,10 @@ module VChainClient
729
760
  @log.error("-> point_type: #{point_type}")
730
761
  @log.error("-> weight: "+ weight.to_s)
731
762
  @log.error("-> timestamp: "+ timestamp.to_s)
732
- @log.error("-> send_data:")
763
+ @log.error("-> raw sent data:")
733
764
  @log.error(send_data)
765
+ @log.error("-> sent data:")
766
+ @log.error(doc_to_send)
734
767
  end
735
768
 
736
769
  return false
@@ -752,8 +785,10 @@ module VChainClient
752
785
  @log.error("-> point_type: #{point_type}")
753
786
  @log.error("-> weight: "+ weight.to_s)
754
787
  @log.error("-> timestamp: "+ timestamp.to_s)
755
- @log.error("-> send_data:")
788
+ @log.error("-> raw sent data:")
756
789
  @log.error(send_data)
790
+ @log.error("-> sent data:")
791
+ @log.error(doc_to_send)
757
792
  end
758
793
 
759
794
  raise e
@@ -804,11 +839,11 @@ module VChainClient
804
839
 
805
840
  def check(input, is_already_hashed = false, preffered_decision_algo = nil)
806
841
 
807
- blockstackClient = VChainClient::BlockstackClient.new(@config)
842
+ cryptoHelper = VChainClient::Crypto.new(@config)
808
843
 
809
844
  client_id = @config["client_id"]
810
845
 
811
- api_url = @config["api"]["url"] + "v0.3/check/";
846
+ api_url = @config["api"]["url"] + "v0.4/check/";
812
847
 
813
848
  document = input
814
849
 
@@ -840,53 +875,16 @@ module VChainClient
840
875
 
841
876
  sent_document = document.clone
842
877
 
843
- vchain_public_key_body = nil
844
-
845
- begin
846
-
847
- vchain_public_key_body = blockstackClient.getPublicKeyRSA("vchain_core_01.id")
848
-
849
- rescue => e
850
- if @log.error?
851
- @log.error("[check] failed to retrieve vchain public RSA key from Blockstack")
852
- @log.error("#{e.class}, #{e.message}")
853
- end
854
-
855
- raise e
856
- end
857
-
858
- if vchain_public_key_body == nil
859
- if @log.error?
860
- @log.error("[check] failed to retrieve vchain public RSA key from Blockstack")
861
- end
862
-
863
- return false
864
- end
865
-
866
- vchain_public_key_str = "-----BEGIN PUBLIC KEY-----\n"
867
- vchain_public_key_str += vchain_public_key_body
868
- vchain_public_key_str += "\n-----END PUBLIC KEY-----"
869
-
870
- vchain_public_key = OpenSSL::PKey::RSA.new(vchain_public_key_str)
871
-
872
- cif = OpenSSL::Cipher.new('AES-256-CBC')
873
-
874
- cif.encrypt
878
+ cyphered_data = cryptoHelper.encodeCypher(document.to_json)
875
879
 
876
- cif.key = key = cif.random_key
877
- cif.iv = iv = cif.random_iv
880
+ encoded_key = cryptoHelper.encodeRSA(cyphered_data["key"])
878
881
 
879
- encoded_doc = cif.update(document.to_json) +
880
- cif.final
881
-
882
- encoded_key = vchain_public_key.public_encrypt(key, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING)
883
-
884
- encoded_iv = vchain_public_key.public_encrypt(iv, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING)
882
+ encoded_iv = cryptoHelper.encodeRSA(cyphered_data["iv"])
885
883
 
886
884
  doc_to_send = {
887
885
  "key" => Base64.encode64(encoded_key),
888
886
  "iv" => Base64.encode64(encoded_iv),
889
- "payload" => Base64.encode64(encoded_doc),
887
+ "payload" => Base64.encode64(cyphered_data["payload"]),
890
888
  "client_id" => client_id
891
889
  }
892
890
 
@@ -960,6 +958,22 @@ module VChainClient
960
958
 
961
959
  # success result
962
960
 
961
+ res_key = cryptoHelper.decodeRSA(Base64.decode64(res["key"]))
962
+
963
+ res_iv = cryptoHelper.decodeRSA(Base64.decode64(res["iv"]))
964
+
965
+ res_docs = cryptoHelper.decodeCypher(Base64.decode64(res["docs"]), res_key, res_iv)
966
+
967
+ res_data_points = cryptoHelper.decodeCypher(Base64.decode64(res["data_points"]), res_key, res_iv)
968
+
969
+ res_names = cryptoHelper.decodeCypher(Base64.decode64(res["names"]), res_key, res_iv)
970
+
971
+ res = {
972
+ "docs" => JSON.parse(res_docs),
973
+ "data_points" => JSON.parse(res_data_points),
974
+ "names" => JSON.parse(res_names)
975
+ }
976
+
963
977
  validated_data_points = self.validate_data_points(res["data_points"], res["docs"])
964
978
 
965
979
  if validated_data_points.length == 0
@@ -1013,7 +1027,7 @@ module VChainClient
1013
1027
 
1014
1028
  blockstackClient = VChainClient::BlockstackClient.new(@config)
1015
1029
 
1016
- signaturesHelper = VChainClient::Signatures.new(@config)
1030
+ cryptoHelper = VChainClient::Crypto.new(@config)
1017
1031
 
1018
1032
  documents_index = {}
1019
1033
 
@@ -1298,7 +1312,7 @@ module VChainClient
1298
1312
 
1299
1313
  begin
1300
1314
 
1301
- if !signaturesHelper.checkTreeSignature(computed_tree_root_hash, blockchain_txid, blockchain_block_hash, blockchain_timestamp, reciept["federative_server_id"], reciept["federative_server_version"], Base64.decode64(reciept["tree_signature"]), federative_server_pubkey)
1315
+ if !cryptoHelper.checkTreeSignature(computed_tree_root_hash, blockchain_txid, blockchain_block_hash, blockchain_timestamp, reciept["federative_server_id"], reciept["federative_server_version"], Base64.decode64(reciept["tree_signature"]), federative_server_pubkey)
1302
1316
  if @log.error?
1303
1317
  @log.error("[check] not a valid blockchain reciept - failed to verify tree signature")
1304
1318
  @log.error(reciept)
@@ -1428,7 +1442,7 @@ module VChainClient
1428
1442
 
1429
1443
  begin
1430
1444
 
1431
- if !signaturesHelper.checkVerificationSignature(data_point["field_hash"], data_point["data_hash"], data_point["doc_hash"], data_point["credentials_hash"], data_point["type"], data_point["weight"], data_point["timestamp"], data_point["issuer_id"], verificator_pubkey, Base64.decode64(data_point["issuer_sig"]), data_point["version"])
1445
+ if !cryptoHelper.checkVerificationSignature(data_point["field_hash"], data_point["data_hash"], data_point["doc_hash"], data_point["credentials_hash"], data_point["type"], data_point["weight"], data_point["timestamp"], data_point["issuer_id"], verificator_pubkey, Base64.decode64(data_point["issuer_sig"]), data_point["version"])
1432
1446
  if @log.error?
1433
1447
  @log.error("[check] not a valid verification - failed to check verificator signature")
1434
1448
  @log.error("--> field_hash: "+ data_point["field_hash"])
@@ -1448,7 +1462,7 @@ module VChainClient
1448
1462
 
1449
1463
  rescue => e
1450
1464
  if @log.error?
1451
- @log.error("[check] Signatures.checkVerificationSignature raised exception:")
1465
+ @log.error("[check] Crypto.checkVerificationSignature raised exception:")
1452
1466
  @log.error("#{e.class}, #{e.message}")
1453
1467
  @log.error("--> field_hash: "+ data_point["field_hash"])
1454
1468
  @log.error("--> data_hash: "+ data_point["data_hash"])
@@ -1498,7 +1512,7 @@ module VChainClient
1498
1512
 
1499
1513
  begin
1500
1514
 
1501
- if !signaturesHelper.checkVerificationSignature(data_point["field_hash"], data_point["data_hash"], data_point["doc_hash"], data_point["credentials_hash"], data_point["type"], data_point["weight"], data_point["timestamp"], data_point["validator_id"], validator_pubkey, Base64.decode64(data_point["validator_sig"]), data_point["version"])
1515
+ if !cryptoHelper.checkVerificationSignature(data_point["field_hash"], data_point["data_hash"], data_point["doc_hash"], data_point["credentials_hash"], data_point["type"], data_point["weight"], data_point["timestamp"], data_point["validator_id"], validator_pubkey, Base64.decode64(data_point["validator_sig"]), data_point["version"])
1502
1516
  if @log.error?
1503
1517
  @log.error("[check] not a valid verification - failed to check validator signature")
1504
1518
  @log.error("--> field_hash: "+ data_point["field_hash"])
@@ -1518,7 +1532,7 @@ module VChainClient
1518
1532
 
1519
1533
  rescue => e
1520
1534
  if @log.error?
1521
- @log.error("[check] Signatures.checkVerificationSignature raised exception:")
1535
+ @log.error("[check] Crypto.checkVerificationSignature raised exception:")
1522
1536
  @log.error("#{e.class}, #{e.message}")
1523
1537
  @log.error("--> field_hash: "+ data_point["field_hash"])
1524
1538
  @log.error("--> data_hash: "+ data_point["data_hash"])
@@ -1552,7 +1566,7 @@ module VChainClient
1552
1566
  return output
1553
1567
  end
1554
1568
 
1555
- def self.generateBlockstackCommand(config, role, validator_sig = nil)
1569
+ def self.generateBlockstackCommand(config, role = "verificator", validator_sig_v2 = nil, validator_sig_v3 = nil)
1556
1570
 
1557
1571
  OpenSSL::PKey::EC.send(:alias_method, :private?, :private_key?)
1558
1572
 
@@ -1570,20 +1584,17 @@ module VChainClient
1570
1584
 
1571
1585
  #A4 validator_vchain_id
1572
1586
  validator_vchain_id = "da93b5f7-2295-4435-a67a-4fc226eca3ac"
1573
- #validator_vchain_id = "35645858-630d-4873-9a2d-1ea7ec3b6d10"
1574
1587
 
1575
1588
  #A5 validator_blockstack_id
1576
1589
  validator_blockstack_id = "vchain_core_01.id"
1577
- #validator_blockstack_id = "master"
1578
1590
 
1579
1591
  #A6 vchain_role
1580
1592
  vchain_role = role
1581
1593
 
1582
1594
  #A7 sig_version
1583
- sig_version = "2"
1595
+ sig_version = "3"
1596
+
1584
1597
 
1585
- #A8 client_sig
1586
- client_sig = nil
1587
1598
  priv_key_path = config["ecc_private_key_location"]
1588
1599
  priv_key = File.read(priv_key_path)
1589
1600
 
@@ -1594,16 +1605,24 @@ module VChainClient
1594
1605
  rsa_pub_key.slice! "\n-----END PUBLIC KEY-----\n"
1595
1606
  rsa_pub_key_aligned = rsa_pub_key.gsub(/\n/, "")
1596
1607
 
1597
- whole_sign = vchain_client_id + vchain_role + blockstack_id + ecc_pub_key + rsa_pub_key + sig_version
1608
+ whole_sign_v2 = vchain_client_id + vchain_role + blockstack_id + ecc_pub_key + rsa_pub_key + "2"
1609
+
1610
+ whole_sign_v3 = vchain_client_id + vchain_role + blockstack_id + ecc_pub_key_aligned + rsa_pub_key_aligned + sig_version
1598
1611
 
1599
1612
  ec = OpenSSL::PKey::EC.new(priv_key)
1600
1613
  digest = OpenSSL::Digest::SHA256.new
1601
1614
 
1602
- whole_signature = ec.sign(digest, whole_sign)
1615
+ whole_signature_v2 = ec.sign(digest, whole_sign_v2)
1616
+
1617
+ whole_signature_v3 = ec.sign(digest, whole_sign_v3)
1603
1618
 
1604
- client_sig = Base64.encode64(whole_signature).gsub(/\n/, "")
1619
+ #A8 client_sig v2
1620
+ client_sig_v2 = Base64.encode64(whole_signature_v2).gsub(/\n/, "")
1621
+
1622
+ #A10 client_sig v3
1623
+ client_sig_v3 = Base64.encode64(whole_signature_v3).gsub(/\n/, "")
1605
1624
 
1606
- if validator_sig == nil
1625
+ if validator_sig_v2 == nil || validator_sig_v3 == nil
1607
1626
 
1608
1627
  puts "blockstack_id = " + blockstack_id
1609
1628
  puts "vchain_client_id = " + vchain_client_id
@@ -1611,20 +1630,23 @@ module VChainClient
1611
1630
  puts "rsa_pub_key = "+ rsa_pub_key_aligned
1612
1631
  puts "validator_vchain_id = "+ validator_vchain_id
1613
1632
  puts "vchain_role = " + vchain_role
1614
- puts "client_sig = " + client_sig
1633
+ puts "client_sig_v2 = " + client_sig_v2
1634
+ puts "client_sig_v3 = " + client_sig_v3
1615
1635
 
1616
1636
  else
1617
1637
  puts "BLOCKSTACK_DEBUG=1 blockstack update "+ blockstack_id +" '$ORIGIN "+ blockstack_id +"
1618
1638
  $TTL 3600
1619
1639
  A1 TXT \""+ ecc_pub_key_aligned +"\"
1620
1640
  A2 TXT \""+ vchain_client_id +"\"
1621
- A3 TXT \""+ validator_sig +"\"
1641
+ A3 TXT \""+ validator_sig_v2 +"\"
1622
1642
  A4 TXT \""+ validator_vchain_id +"\"
1623
1643
  A5 TXT \""+ validator_blockstack_id +"\"
1624
1644
  A6 TXT \""+ vchain_role +"\"
1625
1645
  A7 TXT \""+ sig_version +"\"
1626
- A8 TXT \""+ client_sig +"\"
1646
+ A8 TXT \""+ client_sig_v2 +"\"
1627
1647
  A9 TXT \""+ rsa_pub_key_aligned +"\"
1648
+ A10 TXT \""+ client_sig_v3 +"\"
1649
+ A11 TXT \""+ validator_sig_v3 +"\"
1628
1650
  _tcp._http URI 10 1 \"http://example.com\"
1629
1651
  '"
1630
1652
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vchain_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.34
4
+ version: 1.0.35
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleksandr Gorelik
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-20 00:00:00.000000000 Z
11
+ date: 2017-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: log4r
@@ -84,9 +84,9 @@ files:
84
84
  - lib/vchain_client/blockchain_connection.rb
85
85
  - lib/vchain_client/blockcypher_blockchain_adapter.rb
86
86
  - lib/vchain_client/blockstack_client.rb
87
+ - lib/vchain_client/crypto.rb
87
88
  - lib/vchain_client/decision_algos/decision_algorithm.rb
88
89
  - lib/vchain_client/decision_algos/vector_based_decision_algorithm.rb
89
- - lib/vchain_client/signatures.rb
90
90
  homepage: http://rubygems.org/gems/vchain_client
91
91
  licenses:
92
92
  - MIT
@@ -107,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
107
  version: '0'
108
108
  requirements: []
109
109
  rubyforge_project:
110
- rubygems_version: 2.6.10
110
+ rubygems_version: 2.6.11
111
111
  signing_key:
112
112
  specification_version: 4
113
113
  summary: VChain Platform client written on Ruby