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 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: []