vchain_client 1.0.19 → 1.0.20
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/vchain_client.rb +162 -46
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d0643ce1c08e5014d3a479f4651d2d5975df222
|
4
|
+
data.tar.gz: 642a3199f3b8f94fe31368f634c26da0ebc1f960
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b940cde7cb711e3b4e67c64183c381caf2f3066d122c88961445d73b021fd23102689d3e22c758595423d738c785a952417c5d79bb64996c4148bc1924f36ab
|
7
|
+
data.tar.gz: 372e92c6084f56262a11ded5d8f5e737b8c64bcdaefd19144ae503026978c4b2423c76ef54a9c8ef6908410dd17d7a07b9aa4046d9140bd19fe02453ec505162
|
data/lib/vchain_client.rb
CHANGED
@@ -34,8 +34,12 @@ module VChainClient
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def hash(arr)
|
37
|
-
arr.each { |k, v|
|
38
|
-
|
37
|
+
arr.each { |k, v|
|
38
|
+
if k != "surname" && k != "given_names"
|
39
|
+
arr[k] = Digest::SHA512.hexdigest(v.downcase)
|
40
|
+
else
|
41
|
+
arr[k] = Digest::SHA512.hexdigest(v)
|
42
|
+
end
|
39
43
|
}
|
40
44
|
end
|
41
45
|
|
@@ -56,7 +60,7 @@ module VChainClient
|
|
56
60
|
def cut(arr)
|
57
61
|
arr.each { |k, v|
|
58
62
|
if arr["type"] == FIELD_TYPE_TRAVEL_DOCUMENT_HASHED
|
59
|
-
if k == "type" || k == "
|
63
|
+
if k == "type" || k == "country_code" || k == "number" || k == "surname" || k == "given_names" || k == "birthdate" || k == "nationality" || k == "sex" || k == "birthplace" || k == "issue_date" || k == "expiry_date" || k == "authority"
|
60
64
|
arr[k] = v
|
61
65
|
else
|
62
66
|
arr.delete(k)
|
@@ -76,13 +80,31 @@ module VChainClient
|
|
76
80
|
def get_doc_hash(arr)
|
77
81
|
if arr["type"] == FIELD_TYPE_TRAVEL_DOCUMENT_HASHED
|
78
82
|
|
79
|
-
what_to_hash =
|
83
|
+
what_to_hash = ""
|
84
|
+
what_to_hash += arr["type"] if arr.key?("type")
|
85
|
+
what_to_hash += arr["country_code"] if arr.key?("country_code")
|
86
|
+
what_to_hash += arr["number"] if arr.key?("number")
|
87
|
+
what_to_hash += arr["surname"] if arr.key?("surname")
|
88
|
+
what_to_hash += arr["given_names"] if arr.key?("given_names")
|
89
|
+
what_to_hash += arr["birthdate"] if arr.key?("birthdate")
|
90
|
+
what_to_hash += arr["nationality"] if arr.key?("nationality")
|
91
|
+
what_to_hash += arr["sex"] if arr.key?("sex")
|
92
|
+
what_to_hash += arr["birthplace"] if arr.key?("birthplace")
|
93
|
+
what_to_hash += arr["issue_date"] if arr.key?("issue_date")
|
94
|
+
what_to_hash += arr["expiry_date"] if arr.key?("expiry_date")
|
95
|
+
what_to_hash += arr["authority"] if arr.key?("authority")
|
80
96
|
|
81
97
|
return Digest::SHA512.hexdigest(what_to_hash)
|
82
98
|
|
83
99
|
elsif arr["type"] == FIELD_TYPE_TEST_DOCUMENT_HASHED
|
84
100
|
|
85
|
-
what_to_hash =
|
101
|
+
what_to_hash = ""
|
102
|
+
what_to_hash += arr["type"] if arr.key?("type")
|
103
|
+
what_to_hash += arr["a"] if arr.key?("a")
|
104
|
+
what_to_hash += arr["b"] if arr.key?("b")
|
105
|
+
what_to_hash += arr["c"] if arr.key?("c")
|
106
|
+
what_to_hash += arr["d"] if arr.key?("d")
|
107
|
+
what_to_hash += arr["e"] if arr.key?("e")
|
86
108
|
|
87
109
|
return Digest::SHA512.hexdigest(what_to_hash)
|
88
110
|
|
@@ -91,7 +113,7 @@ module VChainClient
|
|
91
113
|
|
92
114
|
def get_credentials_fields(type)
|
93
115
|
if type == FIELD_TYPE_TRAVEL_DOCUMENT_HASHED
|
94
|
-
return ["type", "
|
116
|
+
return ["type", "number", "given_names", "surname", "birthdate"]
|
95
117
|
|
96
118
|
elsif type == FIELD_TYPE_TEST_DOCUMENT_HASHED
|
97
119
|
return ["type", "a", "b", "c"]
|
@@ -108,16 +130,13 @@ module VChainClient
|
|
108
130
|
def get_similar_credential_sets(type)
|
109
131
|
if type == FIELD_TYPE_TRAVEL_DOCUMENT_HASHED
|
110
132
|
output = []
|
111
|
-
output.push(["type", "
|
112
|
-
output.push(["type", "
|
113
|
-
output.push(["type", "
|
114
|
-
output.push(["type", "
|
115
|
-
output.push(["type", "
|
116
|
-
output.push(["type", "
|
117
|
-
output.push(["type", "
|
118
|
-
output.push(["type", "birthdate", "number", "citizenship"])
|
119
|
-
output.push(["type", "first_name", "last_name", "birthdate"])
|
120
|
-
output.push(["type", "number", "citizenship"])
|
133
|
+
output.push(["type", "number", "surname", "birthdate"])
|
134
|
+
output.push(["type", "number", "given_names", "birthdate"])
|
135
|
+
output.push(["type", "given_names", "surname", "birthdate"])
|
136
|
+
output.push(["type", "number", "given_names", "surname"])
|
137
|
+
output.push(["type", "number", "surname"])
|
138
|
+
output.push(["type", "number", "given_names"])
|
139
|
+
output.push(["type", "number", "birthdate"])
|
121
140
|
return output
|
122
141
|
|
123
142
|
elsif type == FIELD_TYPE_TEST_DOCUMENT_HASHED
|
@@ -138,7 +157,7 @@ module VChainClient
|
|
138
157
|
|
139
158
|
def get_credentials_hash(document)
|
140
159
|
if document["type"] == FIELD_TYPE_TRAVEL_DOCUMENT_HASHED
|
141
|
-
what_to_hash = document["type"] + document["
|
160
|
+
what_to_hash = document["type"] + document["number"] + document["given_names"] + document["surname"] + document["birthdate"]
|
142
161
|
|
143
162
|
return Digest::SHA512.hexdigest(what_to_hash)
|
144
163
|
|
@@ -205,9 +224,32 @@ module VChainClient
|
|
205
224
|
timestamp = time.to_i
|
206
225
|
|
207
226
|
document = input
|
227
|
+
|
228
|
+
# work with names before hashing
|
229
|
+
surnames_arr = document["surname"].split
|
230
|
+
given_names_arr = document["given_names"].split
|
231
|
+
|
232
|
+
hashed_surname = ""
|
233
|
+
sep = ""
|
234
|
+
surnames_arr.each { |surname_part|
|
235
|
+
hashed_surname += sep
|
236
|
+
hashed_surname += Digest::SHA512.hexdigest(surname_part.downcase)
|
237
|
+
sep = " "
|
238
|
+
}
|
239
|
+
|
240
|
+
hashed_given_names = ""
|
241
|
+
sep = ""
|
242
|
+
given_names_arr.each { |given_names_part|
|
243
|
+
hashed_given_names += sep
|
244
|
+
hashed_given_names += Digest::SHA512.hexdigest(given_names_part.downcase)
|
245
|
+
sep = " "
|
246
|
+
}
|
247
|
+
|
248
|
+
document["given_names"] = hashed_given_names
|
249
|
+
document["surname"] = hashed_surname
|
208
250
|
|
209
251
|
document = self.hash(document)
|
210
|
-
|
252
|
+
|
211
253
|
document = self.cut(document)
|
212
254
|
|
213
255
|
doc_hash = self.get_doc_hash(document)
|
@@ -398,12 +440,25 @@ module VChainClient
|
|
398
440
|
|
399
441
|
document = input
|
400
442
|
|
443
|
+
names = {}
|
444
|
+
if document["type"] == FIELD_TYPE_TRAVEL_DOCUMENT
|
445
|
+
names = document["names"]
|
446
|
+
document.delete("names")
|
447
|
+
end
|
448
|
+
|
401
449
|
if (!is_already_hashed)
|
402
450
|
document = self.hash(document)
|
403
451
|
end
|
404
452
|
|
405
453
|
document = self.cut(document)
|
406
454
|
|
455
|
+
if document["type"] == FIELD_TYPE_TRAVEL_DOCUMENT_HASHED
|
456
|
+
document["names"] = []
|
457
|
+
names.each { |name|
|
458
|
+
document["names"].push(Digest::SHA512.hexdigest(name.downcase))
|
459
|
+
}
|
460
|
+
end
|
461
|
+
|
407
462
|
sent_document = document.clone
|
408
463
|
|
409
464
|
document["client_id"] = client_id
|
@@ -470,18 +525,37 @@ module VChainClient
|
|
470
525
|
|
471
526
|
# success result
|
472
527
|
|
473
|
-
|
528
|
+
if sent_document.key?("names")
|
474
529
|
|
475
|
-
|
530
|
+
real_surname = ""
|
476
531
|
|
477
|
-
|
532
|
+
real_given_name = ""
|
533
|
+
|
534
|
+
if res.key?("names") && res["names"].is_a?(Hash)
|
535
|
+
|
536
|
+
if res["names"].key?("given_names")
|
537
|
+
sep = "";
|
538
|
+
res["names"]["given_names"].each { |found_given_name|
|
539
|
+
real_given_name += sep + found_given_name
|
540
|
+
sep = " "
|
541
|
+
}
|
542
|
+
end
|
543
|
+
|
544
|
+
if res["names"].key?("surname")
|
545
|
+
sep = "";
|
546
|
+
res["names"]["surname"].each { |found_surname|
|
547
|
+
real_surname += sep + found_surname
|
548
|
+
sep = " "
|
549
|
+
}
|
550
|
+
end
|
478
551
|
|
479
|
-
if !res_docs_index.key?(res_doc_credentials_hash)
|
480
|
-
res_docs_index[res_doc_credentials_hash] = []
|
481
552
|
end
|
482
553
|
|
483
|
-
|
484
|
-
|
554
|
+
sent_document["given_names"] = Digest::SHA512.hexdigest(real_given_name)
|
555
|
+
sent_document["surname"] = Digest::SHA512.hexdigest(real_surname)
|
556
|
+
|
557
|
+
sent_document.delete("names")
|
558
|
+
end
|
485
559
|
|
486
560
|
validated_data_points = self.validate_data_points(res["data_points"], res["docs"])
|
487
561
|
|
@@ -504,6 +578,40 @@ module VChainClient
|
|
504
578
|
|
505
579
|
# analyse
|
506
580
|
|
581
|
+
new_res_docs = []
|
582
|
+
|
583
|
+
res_docs_index = {}
|
584
|
+
|
585
|
+
# cut and index
|
586
|
+
res["docs"].each { |res_doc|
|
587
|
+
|
588
|
+
full_doc_hash = self.get_doc_hash(res_doc)
|
589
|
+
|
590
|
+
play_doc = {}
|
591
|
+
res_doc.each { |field, value|
|
592
|
+
if sent_document.key?(field)
|
593
|
+
play_doc[field] = value
|
594
|
+
end
|
595
|
+
}
|
596
|
+
|
597
|
+
res_doc_credentials_hash = self.get_credentials_hash(play_doc)
|
598
|
+
|
599
|
+
if !res_docs_index.key?(res_doc_credentials_hash)
|
600
|
+
res_docs_index[res_doc_credentials_hash] = []
|
601
|
+
end
|
602
|
+
|
603
|
+
play_doc["doc_hash"] = self.get_doc_hash(play_doc)
|
604
|
+
|
605
|
+
play_doc["full_doc_hash"] = full_doc_hash
|
606
|
+
|
607
|
+
res_docs_index[res_doc_credentials_hash].push(play_doc)
|
608
|
+
|
609
|
+
new_res_docs.push(play_doc)
|
610
|
+
}
|
611
|
+
|
612
|
+
res["docs"] = new_res_docs
|
613
|
+
|
614
|
+
|
507
615
|
sent_doc_hash = self.get_doc_hash(sent_document)
|
508
616
|
|
509
617
|
sent_credentials_hash = self.get_credentials_hash(sent_document)
|
@@ -566,7 +674,7 @@ module VChainClient
|
|
566
674
|
|
567
675
|
found_docs.each { |cred_doc|
|
568
676
|
|
569
|
-
cred_doc_hash = self.get_doc_hash(cred_doc)
|
677
|
+
cred_doc_hash = cred_doc["full_doc_hash"]#self.get_doc_hash(cred_doc)
|
570
678
|
cred_doc_hash = Digest::SHA512.hexdigest(cred_doc_hash)
|
571
679
|
|
572
680
|
cred_doc_exact_match = validated_data_points[cred_doc_hash]
|
@@ -613,18 +721,22 @@ module VChainClient
|
|
613
721
|
|
614
722
|
non_cred_fields_index.each { |field, values|
|
615
723
|
|
616
|
-
if
|
724
|
+
if sent_document.key?(field)
|
617
725
|
|
618
|
-
values.
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
726
|
+
if values.length == 1
|
727
|
+
|
728
|
+
values.take(1).each { |value, validated_count|
|
729
|
+
if value == sent_document[field]
|
730
|
+
result[field] = validated_count
|
731
|
+
else
|
732
|
+
possible_mistakes.push(field)
|
733
|
+
end
|
734
|
+
}
|
735
|
+
|
736
|
+
else
|
737
|
+
possible_mistakes.push(field)
|
738
|
+
end
|
625
739
|
|
626
|
-
else
|
627
|
-
possible_mistakes.push(field)
|
628
740
|
end
|
629
741
|
|
630
742
|
}
|
@@ -711,18 +823,22 @@ module VChainClient
|
|
711
823
|
|
712
824
|
other_fields_index.each { |field, values|
|
713
825
|
|
714
|
-
if
|
826
|
+
if sent_document.key?(field)
|
715
827
|
|
716
|
-
values.
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
828
|
+
if values.length == 1
|
829
|
+
|
830
|
+
values.take(1).each { |value, validated_count|
|
831
|
+
if value == sent_document[field]
|
832
|
+
result[field] = validated_count
|
833
|
+
else
|
834
|
+
possible_mistakes.push(field)
|
835
|
+
end
|
836
|
+
}
|
837
|
+
|
838
|
+
else
|
839
|
+
possible_mistakes.push(field)
|
840
|
+
end
|
723
841
|
|
724
|
-
else
|
725
|
-
possible_mistakes.push(field)
|
726
842
|
end
|
727
843
|
|
728
844
|
}
|
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.
|
4
|
+
version: 1.0.20
|
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-01-
|
11
|
+
date: 2017-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: log4r
|