verified 0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,8 @@
1
+ class Verified
2
+ def self.check(mrzLine1, mrzLine2, returnData = false)
3
+ @@Checker = Check.new
4
+ @@Checker.check(mrzLine1, mrzLine2, returnData)
5
+ end
6
+ end
7
+
8
+ require "verified/check"
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: []