mirror of
https://github.com/dkam/hsmr.git
synced 2025-12-28 08:44:53 +00:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8afa0cb4df | ||
|
|
733f79c93f | ||
|
|
03c95a6e59 | ||
|
|
51656c62a3 | ||
|
|
c3c94f3236 | ||
|
|
c2cc74848d | ||
|
|
f0c357d2b9 | ||
|
|
c0965ee2c1 | ||
|
|
dbace952c0 |
8
Gemfile
8
Gemfile
@@ -1,11 +1,5 @@
|
||||
source "http://rubygems.org"
|
||||
source "https://rubygems.org"
|
||||
|
||||
# Specify your gem's dependencies in hsmr.gemspec
|
||||
gemspec
|
||||
|
||||
#group :development do
|
||||
# gem 'rb-fsevent', :require => false if RUBY_PLATFORM =~ /darwin/i
|
||||
# gem 'growl', :require => false if RUBY_PLATFORM =~ /darwin/i
|
||||
# gem 'guard-test'
|
||||
# gem 'factory_girl'
|
||||
#end
|
||||
|
||||
51
Gemfile.lock
51
Gemfile.lock
@@ -1,30 +1,43 @@
|
||||
PATH
|
||||
remote: .
|
||||
specs:
|
||||
hsmr (0.0.1)
|
||||
hsmr (0.0.2)
|
||||
|
||||
GEM
|
||||
remote: http://rubygems.org/
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
activesupport (3.1.1)
|
||||
multi_json (~> 1.0)
|
||||
factory_girl (2.2.0)
|
||||
activesupport
|
||||
guard (0.8.8)
|
||||
thor (~> 0.14.6)
|
||||
guard-test (0.4.1)
|
||||
guard (>= 0.4)
|
||||
test-unit (~> 2.2)
|
||||
multi_json (1.0.3)
|
||||
rake (0.9.2.2)
|
||||
test-unit (2.4.1)
|
||||
thor (0.14.6)
|
||||
activesupport (6.1.4)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
zeitwerk (~> 2.3)
|
||||
concurrent-ruby (1.1.9)
|
||||
factory_bot (6.2.0)
|
||||
activesupport (>= 5.0.0)
|
||||
guard-compat (1.2.1)
|
||||
guard-test (2.0.8)
|
||||
guard-compat (~> 1.2)
|
||||
test-unit (~> 3.0)
|
||||
i18n (1.8.10)
|
||||
concurrent-ruby (~> 1.0)
|
||||
minitest (5.14.4)
|
||||
power_assert (2.0.0)
|
||||
rake (13.0.3)
|
||||
test-unit (3.4.4)
|
||||
power_assert
|
||||
tzinfo (2.0.4)
|
||||
concurrent-ruby (~> 1.0)
|
||||
zeitwerk (2.4.2)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
x86_64-darwin-20
|
||||
|
||||
DEPENDENCIES
|
||||
factory_girl
|
||||
guard-test
|
||||
factory_bot (~> 6)
|
||||
guard-test (~> 2)
|
||||
hsmr!
|
||||
rake
|
||||
rake (~> 13)
|
||||
|
||||
BUNDLED WITH
|
||||
2.2.17
|
||||
|
||||
17
README.md
17
README.md
@@ -7,14 +7,12 @@ are implemented for your education or for testing purposes and should not be use
|
||||
Installation
|
||||
-------------
|
||||
|
||||
One day I'll learn how to make gems. Until then, git clone is the only way to use this softawre.
|
||||
gem install hsmr
|
||||
|
||||
Usage
|
||||
---------
|
||||
|
||||
require './lib/hsmr'
|
||||
require './lib/key'
|
||||
require './lib/component'
|
||||
require 'hsmr'
|
||||
|
||||
# Create a Key
|
||||
> key=HSMR::Key.new("4CA2161637D0133E5E151AEA45DA2A12")
|
||||
@@ -56,12 +54,7 @@ Development
|
||||
* Report issues on GitHub Issues.
|
||||
* Pull requests are awesome! Please include test::unit tests
|
||||
|
||||
Author
|
||||
==========
|
||||
License
|
||||
-------
|
||||
|
||||
Dan Milne, http://da.nmilne.com, http://booko.com.au
|
||||
|
||||
Copyright
|
||||
----------
|
||||
|
||||
Copyright (c) 2010 Dan Milne. See LICENSE for details.
|
||||
The gem is available as open source under the terms of the MIT License.
|
||||
|
||||
10
hsmr.gemspec
10
hsmr.gemspec
@@ -8,10 +8,10 @@ Gem::Specification.new do |s|
|
||||
s.authors = ["Dan Milne"]
|
||||
s.email = ["d@nmilne.com"]
|
||||
s.homepage = ""
|
||||
s.homepage = 'https://github.com/dkam/hsmr'
|
||||
s.summary = %q{HSM commands in Ruby}
|
||||
s.description = %q{A collection of methods usually implemented in a HSM (Hardware Security Module)}
|
||||
|
||||
s.rubyforge_project = "hsmr"
|
||||
s.license = 'MIT'
|
||||
|
||||
s.files = `git ls-files`.split("\n")
|
||||
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
||||
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
|
||||
# s.add_development_dependency "rspec"
|
||||
# s.add_runtime_dependency "rest-client"
|
||||
|
||||
s.add_development_dependency "rake"
|
||||
s.add_development_dependency "guard-test"
|
||||
s.add_development_dependency "factory_girl"
|
||||
s.add_development_dependency "rake", '~> 13'
|
||||
s.add_development_dependency "guard-test", "~> 2"
|
||||
s.add_development_dependency "factory_bot", "~> 6"
|
||||
end
|
||||
|
||||
18
lib/hsmr.rb
18
lib/hsmr.rb
@@ -11,8 +11,8 @@ module HSMR
|
||||
## Mixin functionality
|
||||
|
||||
def kcv()
|
||||
des = OpenSSL::Cipher::Cipher.new("des-cbc") if @key.length == 8
|
||||
des = OpenSSL::Cipher::Cipher.new("des-ede-cbc") if @key.length == 16
|
||||
des = OpenSSL::Cipher.new("des-cbc") if @key.length == 8
|
||||
des = OpenSSL::Cipher.new("des-ede-cbc") if @key.length == 16
|
||||
des.encrypt
|
||||
des.key=@key
|
||||
des.update("\x00"*8).unpack('H*').first[0...6].upcase
|
||||
@@ -59,9 +59,9 @@ module HSMR
|
||||
unless key.length == 8 || key.length == 16 || key.length ==24
|
||||
raise TypeError, "key length should be 8, 16 or 24 bytes"
|
||||
end
|
||||
des = OpenSSL::Cipher::Cipher.new("des-cbc") if key.length == 8
|
||||
des = OpenSSL::Cipher::Cipher.new("des-ede-cbc") if key.length == 16
|
||||
des = OpenSSL::Cipher::Cipher.new("des-ede3-cbc") if key.length == 24
|
||||
des = OpenSSL::Cipher.new("des-cbc") if key.length == 8
|
||||
des = OpenSSL::Cipher.new("des-ede-cbc") if key.length == 16
|
||||
des = OpenSSL::Cipher.new("des-ede3-cbc") if key.length == 24
|
||||
|
||||
des.encrypt
|
||||
des.key=key.key
|
||||
@@ -136,7 +136,7 @@ module HSMR
|
||||
|
||||
def self.encrypt_pin(key, pin)
|
||||
@pin = pin.unpack('a2'*(pin.length/2)).map{|x| x.hex}.pack('c'*(pin.length/2))
|
||||
des = OpenSSL::Cipher::Cipher.new("des-ede")
|
||||
des = OpenSSL::Cipher.new("des-ede")
|
||||
des.encrypt
|
||||
des.key=key.key
|
||||
return des.update(@pin).unpack('H*').first.upcase
|
||||
@@ -144,7 +144,7 @@ module HSMR
|
||||
|
||||
def self.decrypt_pin(key, pinblock)
|
||||
@pinblock = pinblock.unpack('a2'*(pinblock.length/2)).map{|x| x.hex}.pack('c'*(pinblock.length/2))
|
||||
des = OpenSSL::Cipher::Cipher.new("des-ede")
|
||||
des = OpenSSL::Cipher.new("des-ede")
|
||||
des.decrypt
|
||||
des.padding=0
|
||||
des.key=key.key
|
||||
@@ -158,7 +158,7 @@ module HSMR
|
||||
validation_data = account.unpack('a2'*(account.length/2)).map{|x| x.hex}.pack('c'*(account.length/2))
|
||||
|
||||
#des = OpenSSL::Cipher::Cipher.new("des-ede-cbc")
|
||||
des = OpenSSL::Cipher::Cipher.new("des-cbc")
|
||||
des = OpenSSL::Cipher.new("des-cbc")
|
||||
des.encrypt
|
||||
des.key=key.key
|
||||
return HSMR::decimalise(des.update(validation_data).unpack('H*').first, :ibm, dtable)[0...plength]
|
||||
@@ -194,7 +194,7 @@ module HSMR
|
||||
def self.pvv(key, account, pvki, pin)
|
||||
tsp = account.to_s[4,11] + pvki.to_s + pin.to_s
|
||||
@tsp = tsp.unpack('a2'*(tsp.length/2)).map{|x| x.hex}.pack('c'*(tsp.length/2))
|
||||
des = OpenSSL::Cipher::Cipher.new("des-ede")
|
||||
des = OpenSSL::Cipher.new("des-ede")
|
||||
des.encrypt
|
||||
des.key=key.key
|
||||
result = des.update(@tsp).unpack('H*').first.upcase
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module HSMR
|
||||
VERSION = "0.0.1"
|
||||
VERSION = "0.0.2"
|
||||
end
|
||||
|
||||
@@ -1,181 +0,0 @@
|
||||
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
||||
|
||||
describe "Generate Component" do
|
||||
it "should generate a component" do
|
||||
component_1 = HSMR::Component.new(nil, HSMR::SINGLE)
|
||||
component_2 = HSMR::Component.new(nil, HSMR::DOUBLE)
|
||||
component_3 = HSMR::Component.new(nil, HSMR::TRIPLE)
|
||||
|
||||
component_1.length.should == 8
|
||||
component_2.length.should == 16
|
||||
component_3.length.should == 24
|
||||
end
|
||||
end
|
||||
|
||||
describe "Calculate component KCV" do
|
||||
|
||||
it "should calculate single length component KCV values" do
|
||||
component_1 = HSMR::Component.new("6DBF C180 4A01 5BAD")
|
||||
component_1.kcv.should == "029E60"
|
||||
|
||||
component_2 = HSMR::Component.new("5D80 0497 B319 8591")
|
||||
component_2.kcv.should == "3B86C3"
|
||||
|
||||
component_3 = HSMR::Component.new("B0C7 7CDC 7354 97C7")
|
||||
component_3.kcv.should == "7A77BC"
|
||||
|
||||
component_4 = HSMR::Component.new("DAE0 86FE D6EA 0BEA")
|
||||
component_4.kcv.should == "2E6191"
|
||||
|
||||
component_5 = HSMR::Component.new("682C 8315 F4BF FBC1")
|
||||
component_5.kcv.should == "62B336"
|
||||
|
||||
component_6 = HSMR::Component.new("5715 F289 04BC B62F")
|
||||
component_6.kcv.should == "3CBA88"
|
||||
|
||||
component_7 = HSMR::Component.new("D0C4 29AE C4A8 02B5")
|
||||
component_7.kcv.should == "33AF02"
|
||||
|
||||
component_8 = HSMR::Component.new("7049 D0F7 4A97 15B6")
|
||||
component_8.kcv.should == "AC1399"
|
||||
|
||||
component_9 = HSMR::Component.new("BC91 D698 157A A4E5")
|
||||
component_9.kcv.should == "295491"
|
||||
|
||||
component_10 = HSMR::Component.new("64AB 8568 7A0E 322F")
|
||||
component_10.kcv.should == "D9F7B3"
|
||||
end
|
||||
|
||||
it "should calculate double length component KCV values" do
|
||||
component_1 = HSMR::Component.new("ADE3 9B38 0DBC DF38 AE02 AECE 64B3 4373")
|
||||
component_1.kcv.should == "3002D5"
|
||||
|
||||
component_2 = HSMR::Component.new("B64A EF86 460D DF5B 57B3 D53D AD37 52A1")
|
||||
component_2.kcv.should == "1F7C07"
|
||||
|
||||
component_3 = HSMR::Component.new("5B89 6E29 76EC 9745 15B5 238C 8CFE 3D23")
|
||||
component_3.kcv.should == "DE78F2"
|
||||
|
||||
component_4 = HSMR::Component.new("5E61 CB20 D540 1FC7 58EC CDC8 B558 E9B9")
|
||||
component_4.kcv.should == "FED957"
|
||||
|
||||
component_5 = HSMR::Component.new("23DF CEB9 BF94 ADA8 91E9 580B 8C8F 5BEF")
|
||||
component_5.kcv.should == "902085"
|
||||
|
||||
component_6 = HSMR::Component.new("DFEF 61C8 2037 3DA4 CE9B 92CD 89E9 B334")
|
||||
component_6.kcv.should == "E45EB7"
|
||||
|
||||
component_7 = HSMR::Component.new("6746 9E4C FE83 F831 F23E 9D9E 9D9E 9DB3")
|
||||
component_7.kcv.should == "813B7B"
|
||||
|
||||
component_8 = HSMR::Component.new("23E5 496E DF94 0BD5 9734 B07A BF26 B9E6")
|
||||
component_8.kcv.should == "E7C48F"
|
||||
|
||||
component_9 = HSMR::Component.new("974F 26BC CB2A ECD5 434F 1CDC 64DF A275")
|
||||
component_9.kcv.should == "E27250"
|
||||
|
||||
component_10 = HSMR::Component.new("E57A DF5B CEA7 F42A DFD9 E554 07A2 F891")
|
||||
component_10.kcv.should == "50E3F8"
|
||||
end
|
||||
end
|
||||
|
||||
describe "Calculate key KCV" do
|
||||
|
||||
it "should calculate single length key KCV values" do
|
||||
key_1 = HSMR::Key.new("6DBF C180 4A01 5BAD")
|
||||
key_1.kcv.should == "029E60"
|
||||
|
||||
key_2 = HSMR::Key.new("5D80 0497 B319 8591")
|
||||
key_2.kcv.should == "3B86C3"
|
||||
|
||||
key_3 = HSMR::Key.new("B0C7 7CDC 7354 97C7")
|
||||
key_3.kcv.should == "7A77BC"
|
||||
|
||||
key_4 = HSMR::Key.new("DAE0 86FE D6EA 0BEA")
|
||||
key_4.kcv.should == "2E6191"
|
||||
|
||||
key_5 = HSMR::Key.new("682C 8315 F4BF FBC1")
|
||||
key_5.kcv.should == "62B336"
|
||||
|
||||
key_6 = HSMR::Key.new("5715 F289 04BC B62F")
|
||||
key_6.kcv.should == "3CBA88"
|
||||
|
||||
key_7 = HSMR::Key.new("D0C4 29AE C4A8 02B5")
|
||||
key_7.kcv.should == "33AF02"
|
||||
|
||||
key_8 = HSMR::Key.new("7049 D0F7 4A97 15B6")
|
||||
key_8.kcv.should == "AC1399"
|
||||
|
||||
key_9 = HSMR::Key.new("BC91 D698 157A A4E5")
|
||||
key_9.kcv.should == "295491"
|
||||
|
||||
key_10 = HSMR::Key.new("64AB 8568 7A0E 322F")
|
||||
key_10.kcv.should == "D9F7B3"
|
||||
end
|
||||
it "should calculate double length key KCV values" do
|
||||
key_1 = HSMR::Key.new("ADE3 9B38 0DBC DF38 AE02 AECE 64B3 4373")
|
||||
key_1.kcv.should == "3002D5"
|
||||
|
||||
key_2 = HSMR::Key.new("B64A EF86 460D DF5B 57B3 D53D AD37 52A1")
|
||||
key_2.kcv.should == "1F7C07"
|
||||
|
||||
key_3 = HSMR::Key.new("5B89 6E29 76EC 9745 15B5 238C 8CFE 3D23")
|
||||
key_3.kcv.should == "DE78F2"
|
||||
|
||||
key_4 = HSMR::Key.new("5E61 CB20 D540 1FC7 58EC CDC8 B558 E9B9")
|
||||
key_4.kcv.should == "FED957"
|
||||
|
||||
key_5 = HSMR::Key.new("23DF CEB9 BF94 ADA8 91E9 580B 8C8F 5BEF")
|
||||
key_5.kcv.should == "902085"
|
||||
|
||||
key_6 = HSMR::Key.new("DFEF 61C8 2037 3DA4 CE9B 92CD 89E9 B334")
|
||||
key_6.kcv.should == "E45EB7"
|
||||
|
||||
key_7 = HSMR::Key.new("6746 9E4C FE83 F831 F23E 9D9E 9D9E 9DB3")
|
||||
key_7.kcv.should == "813B7B"
|
||||
|
||||
key_8 = HSMR::Key.new("23E5 496E DF94 0BD5 9734 B07A BF26 B9E6")
|
||||
key_8.kcv.should == "E7C48F"
|
||||
|
||||
key_9 = HSMR::Key.new("974F 26BC CB2A ECD5 434F 1CDC 64DF A275")
|
||||
key_9.kcv.should == "E27250"
|
||||
|
||||
key_10 = HSMR::Key.new("E57A DF5B CEA7 F42A DFD9 E554 07A2 F891")
|
||||
key_10.kcv.should == "50E3F8"
|
||||
end
|
||||
end
|
||||
|
||||
describe "Calculate parity" do
|
||||
it "should detect odd_parity in a key" do
|
||||
odd_key = HSMR::Key.new("41A2AC14A90C583741A2AC14A90C5837")
|
||||
odd_key.odd_parity?.should == false
|
||||
end
|
||||
|
||||
it "should set double length key parity to odd" do
|
||||
odd_key = HSMR::Key.new("41A2AC14A90C583741A2AC14A90C5837")
|
||||
|
||||
odd_key.set_odd_parity
|
||||
|
||||
even_key = HSMR::Key.new("40A2AD15A80D583740A2AD15A80D5837")
|
||||
|
||||
odd_key.key.should == even_key.key
|
||||
|
||||
end
|
||||
|
||||
it "should detect odd_parity in a component" do
|
||||
odd_component = HSMR::Component.new("41A2AC14A90C583741A2AC14A90C5837")
|
||||
odd_component.odd_parity?.should == false
|
||||
end
|
||||
|
||||
it "should set double length component parity to odd" do
|
||||
odd_component = HSMR::Component.new("41A2AC14A90C583741A2AC14A90C5837")
|
||||
|
||||
odd_component.set_odd_parity
|
||||
|
||||
even_component = HSMR::Component.new("40A2AD15A80D583740A2AD15A80D5837")
|
||||
|
||||
odd_component.component.should == even_component.component
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,12 +0,0 @@
|
||||
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
||||
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
||||
require 'rspec'
|
||||
require 'hsmr'
|
||||
|
||||
# Requires supporting files with custom matchers and macros, etc,
|
||||
# in ./support/ and its subdirectories.
|
||||
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
||||
|
||||
RSpec.configure do |config|
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user