verified 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.
- checksums.yaml +15 -0
- data/lib/verified/check.rb +67 -0
- data/lib/verified/checkdigit.rb +18 -0
- data/lib/verified.rb +8 -0
- metadata +47 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
OTdmYzE3MzUxNzNlNDZlM2NkODE1MjEyZDNjOWU4OTQ5ZDBjMDhjYw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZWU5ZTA3NTEzZDVkOGU2MDQ4N2IwMDYxNjRjZDJiMzUwMDNhYTkzZQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
Zjg2MzYxZjE5NTAzM2NlNTVkNWIyOGM0NzUzYjE5N2VhYTc3ZjUwZjk2MzE1
|
10
|
+
ZTM1MjE2MjRiOTk4NzEyMWVhZDZjMTkzZTcyZDg3Y2E5MTQ5MWU0YjMwYmNi
|
11
|
+
OTA2MGJhZjhiYTA1ZGJkNjM1NjZiMzA0NDg2MTBlMmZkNGFlMGU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YTk1ZmZjMGNlN2Y1NzMzZWFkNDQ2ZGVjMWVkNzFhZDc0MGY2ZmY5NmVjYTIy
|
14
|
+
MzJkNjUwNWRlOWYxZjdlZmMyMzNiODg5Y2ZlYjkwNGIyOTRlYWY0YzJmYWZl
|
15
|
+
NTExMzM3MjBmNGI0ZTJmYjI3YjQyMDAzZjRmMjY1OWJjMWU1M2U=
|
@@ -0,0 +1,67 @@
|
|
1
|
+
class Check
|
2
|
+
def check(mrzLine1, mrzLine2, returnInfo = false)
|
3
|
+
#make a new digit checker
|
4
|
+
@@DigitChecker = CheckDigit.new
|
5
|
+
#string manipulation to simply reading the first line
|
6
|
+
split1 = mrzLine1.gsub(/<+/, '<').split('<')
|
7
|
+
#get data unformatted from passport
|
8
|
+
docData = Hash.new(9)
|
9
|
+
#first line of MRZ
|
10
|
+
docData["IssuingState"] = mrzLine1[2...5]
|
11
|
+
docData["LastName"] = split1[1][3..-1]
|
12
|
+
docData["FirstNames"] = split1[2..-1]
|
13
|
+
|
14
|
+
#second line of MRZ
|
15
|
+
docData["Number"] = mrzLine2[0...9]
|
16
|
+
docData["Nationality"] = mrzLine2[10...13]
|
17
|
+
docData["DateOfBirth"] = mrzLine2[13...19]
|
18
|
+
docData["Gender"] = mrzLine2[20]
|
19
|
+
docData["ExpiryDate"] = mrzLine2[21...27]
|
20
|
+
docData["PersonalNumber"] = mrzLine2[28...42]
|
21
|
+
|
22
|
+
#mrz given check digits
|
23
|
+
docCheck = Array.new
|
24
|
+
docCheck[0] = mrzLine2[9].to_s
|
25
|
+
docCheck[1] = mrzLine2[19].to_s
|
26
|
+
docCheck[2] = mrzLine2[27].to_s
|
27
|
+
docCheck[3] = mrzLine2[42].to_s
|
28
|
+
docCheck[4] = mrzLine2[43].to_s
|
29
|
+
|
30
|
+
#calculate our own check digits
|
31
|
+
ourCheck = Array.new
|
32
|
+
ourCheck[0] = @@DigitChecker.checkCalc(mrzLine2[0...9])
|
33
|
+
ourCheck[1] = @@DigitChecker.checkCalc(mrzLine2[13...19])
|
34
|
+
ourCheck[2] = @@DigitChecker.checkCalc(mrzLine2[21...27])
|
35
|
+
ourCheck[3] = @@DigitChecker.checkCalc(mrzLine2[28...42])
|
36
|
+
ourCheck[4] = @@DigitChecker.checkCalc(mrzLine2[0...10]+mrzLine2[13...20]+mrzLine2[21...43])
|
37
|
+
|
38
|
+
#the 4th check digit can be either > or 0, we always return 0 from our CheckDigit calc.
|
39
|
+
#this basically changes our check to > so the true return can pass
|
40
|
+
if ourCheck[3] == "0" && docCheck[3] == "<"
|
41
|
+
ourCheck[3] = "<"
|
42
|
+
end
|
43
|
+
|
44
|
+
return docData if docCheck.uniq.sort == ourCheck.uniq.sort && returnInfo == true
|
45
|
+
return true if docCheck.uniq.sort == ourCheck.uniq.sort
|
46
|
+
return false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class Check::CheckDigit
|
51
|
+
def checkCalc(str)
|
52
|
+
str = str.strip.upcase
|
53
|
+
values = str.chars.map do |char|
|
54
|
+
case char
|
55
|
+
when '<'
|
56
|
+
0
|
57
|
+
when 'A'..'Z'
|
58
|
+
char.ord - 65 + 10
|
59
|
+
when '0'..'9'
|
60
|
+
char.ord - 48
|
61
|
+
else
|
62
|
+
raise "Unexpected character '#{char}'"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
return (values.zip([7,3,1].cycle).map{|(v,w)| v * w}.reduce(:+) % 10).to_s
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CheckDigit
|
2
|
+
def check(str)
|
3
|
+
str = str.strip.upcase
|
4
|
+
values = str.chars.map do |char|
|
5
|
+
case char
|
6
|
+
when '<'
|
7
|
+
0
|
8
|
+
when 'A'..'Z'
|
9
|
+
char.ord - 65 + 10
|
10
|
+
when '0'..'9'
|
11
|
+
char.ord - 48
|
12
|
+
else
|
13
|
+
raise "Unexpected character '#{char}'"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
return (values.zip([7,3,1].cycle).map{|(v,w)| v * w}.reduce(:+) % 10).to_s
|
17
|
+
end
|
18
|
+
end
|
data/lib/verified.rb
ADDED
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: verified
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ruby
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-26 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A simple gem to verify MRZ codes on passports. Useful if you need to
|
14
|
+
comply with KYC or Money Laundering ID checks.
|
15
|
+
email: ruby@mewmew.io
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/verified.rb
|
21
|
+
- lib/verified/check.rb
|
22
|
+
- lib/verified/checkdigit.rb
|
23
|
+
homepage: http://github.com/rubyisilluminati/verified
|
24
|
+
licenses:
|
25
|
+
- MIT
|
26
|
+
metadata: {}
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ! '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubyforge_project:
|
43
|
+
rubygems_version: 2.4.1
|
44
|
+
signing_key:
|
45
|
+
specification_version: 4
|
46
|
+
summary: Really simple passport verification.
|
47
|
+
test_files: []
|