iso7812 1.0.0
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.
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/Rakefile +1 -0
- data/iso7812.gemspec +22 -0
- data/lib/iso7812.rb +6 -0
- data/lib/iso7812/card_number.rb +96 -0
- data/lib/iso7812/version.rb +3 -0
- data/spec/card_number_spec.rb +25 -0
- data/spec/spec_helper.rb +8 -0
- metadata +81 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Eduardo Mourao
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Ruby ISO-7812 Implementation
|
2
|
+
|
3
|
+
This is the full ISO-7812 implementation, in ruby! This is battle tested, production ready. Use at will.
|
4
|
+
|
5
|
+
I also included the specification itself in the 'doc' folder (PDF). I paid for it, but you shouldn't. Information should be free.
|
6
|
+
|
7
|
+
The project is 100% documented and you shouldn't have any problem understanding the standard just by reading the comments.
|
8
|
+
|
9
|
+
I recommend that you copy those files into your own project and not use this as a gem.
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add this line to your application's Gemfile:
|
14
|
+
|
15
|
+
gem 'iso7812'
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install iso7812
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
require 'iso7812'
|
28
|
+
|
29
|
+
include Iso7812::CardNumber
|
30
|
+
|
31
|
+
# See available methods on card_number.rb
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/iso7812.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'iso7812/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
|
8
|
+
gem.add_development_dependency "rspec"
|
9
|
+
|
10
|
+
gem.name = "iso7812"
|
11
|
+
gem.version = Iso7812::VERSION
|
12
|
+
gem.authors = ["Eduardo Mourao"]
|
13
|
+
gem.email = ["eduardo.a20@gmail.com"]
|
14
|
+
gem.description = %q{Full implementation of the ISO-7812 standard}
|
15
|
+
gem.summary = %q{Full implementation of the ISO-7812 standard}
|
16
|
+
gem.homepage = ""
|
17
|
+
|
18
|
+
gem.files = `git ls-files`.split($/)
|
19
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
20
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
21
|
+
gem.require_paths = ["lib"]
|
22
|
+
end
|
data/lib/iso7812.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
|
2
|
+
##
|
3
|
+
#
|
4
|
+
# The ISO/IEC 7812 specifies a numbering system for the identification of issuers of cards
|
5
|
+
# that require an issuer identification number (IIN) to operate in international,
|
6
|
+
# interindustry and/or intra-industry interchange.
|
7
|
+
#
|
8
|
+
module Iso7812
|
9
|
+
|
10
|
+
module CardNumber
|
11
|
+
##
|
12
|
+
# The Structure of a card
|
13
|
+
#
|
14
|
+
# POS | DESCRIPTION
|
15
|
+
# --------------------
|
16
|
+
# 0 | MII
|
17
|
+
# 0..5 | IIN
|
18
|
+
# 6..n | IAI (max length = 12)
|
19
|
+
# n+1 | Check digit
|
20
|
+
#
|
21
|
+
|
22
|
+
# Generates a valid card number based on the parameters given
|
23
|
+
# IIN - Issuer Identification Number
|
24
|
+
# IAI - Individual Account Identificaation
|
25
|
+
def generate(iin, iai)
|
26
|
+
p = "#{iin}#{iai}"
|
27
|
+
"#{p}#{checkdigit(p).to_s}"
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns true if card number is valid
|
31
|
+
# PAN - Primary Account Number (card number)
|
32
|
+
#
|
33
|
+
# This code is written to convey clarity.
|
34
|
+
def valid?(pan)
|
35
|
+
# must be numbers
|
36
|
+
return false unless pan =~ /^[0-9]+$/
|
37
|
+
|
38
|
+
# 8 is the minimum size
|
39
|
+
return false unless pan.length > 7
|
40
|
+
|
41
|
+
# 19 is maximum size
|
42
|
+
return false unless pan.length < 20
|
43
|
+
|
44
|
+
# check digit
|
45
|
+
return pan[pan.length-1] == checkdigit(pan.chop).to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns the IIN of this PAN
|
49
|
+
# IIN - Issuer Identification Number
|
50
|
+
# PAN - Primary Account Number (card number)
|
51
|
+
def iin(pan)
|
52
|
+
pan[0..5]
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns the MII of this PAN or IIN
|
56
|
+
# IIN - Issuer Identification Number
|
57
|
+
# PAN - Primary Account Number (card number)
|
58
|
+
# MII - Major Industry Identifier
|
59
|
+
#
|
60
|
+
# There are ten single-digit MIIs:
|
61
|
+
# 0 for assignment by ISO/TC 68 and for other future industry assignments
|
62
|
+
# 1 airlines
|
63
|
+
# 2 airlines and other future industry assignments
|
64
|
+
# 3 travel and entertainment and banking/financial
|
65
|
+
# 4 banking/financial
|
66
|
+
# 5 banking/financial
|
67
|
+
# 6 merchandising and banking/financial
|
68
|
+
# 7 petroleum and other future industry assignments
|
69
|
+
# 8 healthcare, telecommunications and other future industry assignments
|
70
|
+
# 9 for assignment by national standards bodies
|
71
|
+
# New industry assignments shall be approved by the RMG.
|
72
|
+
# The MII does not in any way reflect or limit the application in which the card is usable.
|
73
|
+
# Single-digit MIIs are assigned using the applicant’s description of their main area of business
|
74
|
+
# on the application form (see Annex A of ISO/IEC 7812-2:2000).
|
75
|
+
def mii(pan_or_iin)
|
76
|
+
pan_or_iin[0]
|
77
|
+
end
|
78
|
+
|
79
|
+
# The individual account identification shall be followed by a check digit.
|
80
|
+
# This digit shall be calculated on all the preceding digits of the PAN
|
81
|
+
# and shall be computed according to the Luhn formula for modulus-10 check digit.
|
82
|
+
def checkdigit(number)
|
83
|
+
digits = number.to_s.reverse.scan(/\d/).map { |x| x.to_i }
|
84
|
+
digits = digits.each_with_index.map { |d, i|
|
85
|
+
d *= 2 if i.even?
|
86
|
+
d > 9 ? d - 9 : d
|
87
|
+
}
|
88
|
+
sum = digits.inject(0) { |m, x| m + x }
|
89
|
+
mod = 10 - sum % 10
|
90
|
+
mod==10 ? 0 : mod
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Iso7812::CardNumber
|
4
|
+
|
5
|
+
describe "CardNumber" do
|
6
|
+
|
7
|
+
it "should correctly validates a card" do
|
8
|
+
valid?("378761728695330").should eq true
|
9
|
+
valid?("4485006611888499").should eq true
|
10
|
+
valid?("5351196743543506").should eq true
|
11
|
+
valid?("6011925914749389").should eq true
|
12
|
+
|
13
|
+
valid?("378761728695331").should eq false
|
14
|
+
valid?("4485006611888491").should eq false
|
15
|
+
valid?("5351196743543501").should eq false
|
16
|
+
valid?("6011925914749381").should eq false
|
17
|
+
|
18
|
+
valid?("6011").should eq false
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should correctly generate a card" do
|
22
|
+
generate("448500", "661188849").should eq("4485006611888499")
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: iso7812
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Eduardo Mourao
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-05-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: Full implementation of the ISO-7812 standard
|
31
|
+
email:
|
32
|
+
- eduardo.a20@gmail.com
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- .gitignore
|
38
|
+
- .rspec
|
39
|
+
- Gemfile
|
40
|
+
- LICENSE.txt
|
41
|
+
- README.md
|
42
|
+
- Rakefile
|
43
|
+
- iso7812.gemspec
|
44
|
+
- lib/iso7812.rb
|
45
|
+
- lib/iso7812/card_number.rb
|
46
|
+
- lib/iso7812/version.rb
|
47
|
+
- spec/card_number_spec.rb
|
48
|
+
- spec/spec_helper.rb
|
49
|
+
homepage: ''
|
50
|
+
licenses: []
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
hash: -2394687770318694498
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
segments:
|
71
|
+
- 0
|
72
|
+
hash: -2394687770318694498
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 1.8.24
|
76
|
+
signing_key:
|
77
|
+
specification_version: 3
|
78
|
+
summary: Full implementation of the ISO-7812 standard
|
79
|
+
test_files:
|
80
|
+
- spec/card_number_spec.rb
|
81
|
+
- spec/spec_helper.rb
|