pwn 0.4.477 → 0.4.478

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12b3517ec1a98f073c21f689d8f0812da237bd0d2715956afe5de02e69a1c9f9
4
- data.tar.gz: e7a84eaaee6639f4241bd08a0ceee50745f55f89cd348744fb2daa7e5881017a
3
+ metadata.gz: '09d06003d8060cade6a56174ce2237cb1d60044e596117e66b8dd882778bc971'
4
+ data.tar.gz: 00d295054465bae88230fd25606a00c10fe635478300b40409af241e99f20322
5
5
  SHA512:
6
- metadata.gz: 25c56b798321a8fdf4c840b99ccf3c09819eb9493fea94305d5dd7a3425284b423155e741e7c5329a9af1f0c0b14831779a8e1238fcde5503514b7dcbd130d91
7
- data.tar.gz: 830e16467f649042771d4ebe0fb8318af2abdc4ed8ab7cf7771c110c020569ebe2ff6c4be28d719e3ab00a0ffe834b004836b723e11ad0acaf17df7c87aef32c
6
+ metadata.gz: 5ddbe9550e2d6ecf8f480fc76ffaa2c44b04db21e53e3d617a7cc562ffa26a34e44db6aaee0ad1972c96533a3f91ecec97a1f8159a797db3e994405a7163904b
7
+ data.tar.gz: 309fb8124dbf9c76fa24b89b984b32f1e8f11869395e8e95d3bd6ba79f4438ed814475b5329dd0e5f6e660092e5d7f681cb002d4734a3c5f0af0b7a0fe7cd8d2
data/Gemfile CHANGED
@@ -33,7 +33,7 @@ gem 'ipaddress', '0.8.3'
33
33
  gem 'js-beautify', '0.1.8'
34
34
  gem 'json', '2.6.2'
35
35
  gem 'jsonpath', '1.1.2'
36
- gem 'jwt', '2.3.0'
36
+ gem 'jwt', '2.4.0'
37
37
  gem 'luhn', '1.0.2'
38
38
  gem 'mail', '2.7.1'
39
39
  gem 'mongo', '2.17.1'
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ rvm use ruby-3.1.2@pwn
37
37
  $ rvm list gemsets
38
38
  $ gem install --verbose pwn
39
39
  $ pwn
40
- pwn[v0.4.477]:001 >>> PWN.help
40
+ pwn[v0.4.478]:001 >>> PWN.help
41
41
  ```
42
42
 
43
43
  [![Installing the pwn Security Automation Framework](https://raw.githubusercontent.com/0dayInc/pwn/master/documentation/pwn_install.png)](https://youtu.be/G7iLUY4FzsI)
@@ -52,7 +52,7 @@ $ rvm use ruby-3.1.2@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.4.477]:001 >>> PWN.help
55
+ pwn[v0.4.478]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
 
@@ -75,26 +75,10 @@ begin
75
75
  # )
76
76
  # puts exec_resp.inspect
77
77
 
78
- # TODO: Parse Binary Bits to Derive Readable Configuration
79
- # e.g. 'Read & Write All Three Tracks' if binary_resp == '11101111'
80
- # Probably better to split each bit and then evaluate
81
- # binary_resp_arr = binary_resp.chars
82
- # --------------------------------------------------
83
- # Bit|Bit = 0 |Bit = 1
84
- # --------------------------------------------------
85
- # 0 |Track 1 Read not present |Track 1 Read present
86
- # 1 |Track 2 Read not present |Track 2 Read present
87
- # 2 |Track 3 Read not present |Track 3 Read present
88
- # 3 |not used – should be 0 |not used
89
- # 4 |Track 3 Write not present|Track 3 Write present
90
- # 5 |Track 2 Write not present|Track 2 Write present
91
- # 6 |Track 1 Write not present|Track 1 Write present
92
- # 7 |parity bit** |parity bit**
93
- exec_resp = PWN::Plugins::MSR206.exec(
94
- msr206_obj: msr206_obj,
95
- cmd: :configuration_request
78
+ config_hash = PWN::Plugins::MSR206.get_config(
79
+ msr206_obj: msr206_obj
96
80
  )
97
- puts "Configuration Bits: #{exec_resp[:binary].first.reverse}"
81
+ puts "Configuration: #{config_hash.inspect}"
98
82
 
99
83
  exec_resp = PWN::Plugins::MSR206.exec(
100
84
  msr206_obj: msr206_obj,
@@ -114,9 +98,10 @@ begin
114
98
 
115
99
  puts "\n>> MAIN MENU OPTIONS:"
116
100
  puts '[(R)ead Card]'
101
+ puts '[(B)ackup Card]'
117
102
  puts '[(C)opy Card]'
103
+ puts '[(L)oad Card from File]'
118
104
  puts '[(E)dit Card]'
119
- puts '[(B)ackup Card]'
120
105
  puts '[(W)arm Reset]'
121
106
  puts '[(Q)uit]'
122
107
  puts menu_msg
@@ -126,77 +111,41 @@ begin
126
111
 
127
112
  case option
128
113
  when :R
129
- menu_msg = 'READY TO READ - PLEASE SWIPE CARD'
114
+ menu_msg = 'READ CARD'
130
115
  # Read Card
131
116
  track_data = PWN::Plugins::MSR206.read_card(
132
- msr206_obj: msr206_obj,
133
- type: :arm_to_read
117
+ msr206_obj: msr206_obj
118
+ )
119
+ when :B
120
+ menu_msg = 'BACKUP CARD TO FILE'
121
+ # Read Card to Backup
122
+ track_data = PWN::Plugins::MSR206.backup_card(
123
+ msr206_obj: msr206_obj
134
124
  )
135
125
  when :C
136
- menu_msg = 'READY TO COPY - PLEASE SWIPE ORIGINAL CARD'
137
- # Read Original Card
138
- track_data = PWN::Plugins::MSR206.read_card(
139
- msr206_obj: msr206_obj,
140
- type: :arm_to_read
126
+ menu_msg = 'COPY CARD'
127
+ # Copy Card
128
+ track_data = PWN::Plugins::MSR206.copy_card(
129
+ msr206_obj: msr206_obj
130
+ )
131
+ when :L
132
+ menu_msg = 'LOAD FROM FILE'
133
+ # Read Card to Backup
134
+ track_data = PWN::Plugins::MSR206.load_card_from_file(
135
+ msr206_obj: msr206_obj
141
136
  )
142
-
143
- # TODO: Save Original Card Contents
144
- # arm_to_write card to clone
145
- # read cloned card to verify successful write
146
137
  when :E
147
- menu_msg = 'READY TO EDIT - PLEASE SWIPE TARGET CARD'
138
+ menu_msg = 'EDIT'
148
139
  # Read Target Card
149
- track_data = PWN::Plugins::MSR206.read_card(
150
- msr206_obj: msr206_obj,
151
- type: :arm_to_read
140
+ track_data = PWN::Plugins::MSR206.edit_card(
141
+ msr206_obj: msr206_obj
152
142
  )
153
143
 
154
144
  # TODO: Save Original Card Contents
155
145
  # arm_to_write card to edit
156
146
  # read edited card to verify successful write
157
- when :B
158
- menu_msg = 'READY TO BACKUP - PLEASE SWIPE CARD'
159
- # Read Card to Backup
160
- track_data = PWN::Plugins::MSR206.read_card(
161
- msr206_obj: msr206_obj,
162
- type: :arm_to_read
163
- )
164
-
165
- file = ''
166
- backup_msg = ''
167
- loop do
168
- if backup_msg.empty?
169
- exec_resp = PWN::Plugins::MSR206.exec(
170
- msr206_obj: msr206_obj,
171
- cmd: :green_flash
172
- )
173
- end
174
-
175
- print 'Enter File Name to Save Backup: '
176
- file = gets.scrub.chomp.strip
177
- file_dir = File.dirname(file)
178
- break if Dir.exist?(file_dir)
179
-
180
- backup_msg = "\n****** ERROR: Directory #{file_dir} for #{file} does not exist ******"
181
- puts backup_msg
182
- exec_resp = PWN::Plugins::MSR206.exec(
183
- msr206_obj: msr206_obj,
184
- cmd: :green_off
185
- )
186
- exec_resp = PWN::Plugins::MSR206.exec(
187
- msr206_obj: msr206_obj,
188
- cmd: :yellow_flash
189
- )
190
- end
191
-
192
- File.write(file, "#{track_data.to_json}\n")
193
- exec_resp = PWN::Plugins::MSR206.exec(
194
- msr206_obj: msr206_obj,
195
- cmd: :yellow_off
196
- )
197
-
198
- puts 'complete.'
199
147
  when :W
148
+ menu_msg = 'WARM RESET'
200
149
  exec_resp = PWN::Plugins::MSR206.exec(
201
150
  msr206_obj: msr206_obj,
202
151
  cmd: :simulate_power_cycle_warm_reset
@@ -402,7 +402,7 @@ module PWN
402
402
  when '7E'
403
403
  response[:msg] = :command_not_supported_by_hardware
404
404
  else
405
- response[:msg] = :data
405
+ response[:msg] = :response
406
406
  end
407
407
 
408
408
  next_response_detected = false
@@ -410,7 +410,7 @@ module PWN
410
410
  keep_parsing_responses = false
411
411
  end
412
412
 
413
- response[:raw] = raw_byte_arr
413
+ response[:hex] = raw_byte_arr
414
414
  response[:binary] = binary(raw_byte_arr: raw_byte_arr)
415
415
  response[:decoded] = decode(raw_byte_arr: raw_byte_arr)
416
416
  response
@@ -574,16 +574,18 @@ module PWN
574
574
  end
575
575
 
576
576
  # Supported Method Parameters::
577
- # wait_for_swipe(
577
+ # MSR206.wait_for_swipe(
578
578
  # msr206_obj: 'required - msr206_obj returned from #connect method'
579
579
  # type: 'required - swipe type :arm_to_read || :arm_to_read_w_speed_prompts || :arm_to_write_no_raw || :arm_to_write_with_raw || :arm_to_write_with_raw_speed_prompts',
580
- # encoding: required - :iso || :iso_alt || :raw'
580
+ # encoding: 'required - :iso || :iso_alt || :raw',
581
+ # track_data: 'optional - track_data to write'
581
582
  # )
582
583
 
583
584
  private_class_method def self.wait_for_swipe(opts = {})
584
585
  msr206_obj = opts[:msr206_obj]
585
586
  type = opts[:type].to_s.scrub.strip.chomp.to_sym
586
587
  encoding = opts[:encoding].to_s.scrub.strip.chomp.to_sym
588
+ track_data = opts[:track_data]
587
589
 
588
590
  exec_resp = exec(
589
591
  msr206_obj: msr206_obj,
@@ -600,26 +602,26 @@ module PWN
600
602
  cmd: :green_on
601
603
  )
602
604
 
603
- exec_resp = PWN::Plugins::MSR206.exec(
604
- msr206_obj: msr206_obj,
605
- cmd: type
606
- )
605
+ track_data_arr = []
607
606
 
608
- print 'Ready. Please Swipe Card Now:'
609
- loop do
610
- exec_resp = parse_responses(
607
+ case type
608
+ when :arm_to_read,
609
+ :arm_to_read_w_speed_prompts
610
+
611
+ exec_resp = PWN::Plugins::MSR206.exec(
611
612
  msr206_obj: msr206_obj,
612
613
  cmd: type
613
614
  )
614
615
 
615
- break if exec_resp[:msg] == :ack_command_completed
616
- end
617
-
618
- track_data_arr = []
616
+ print 'Ready to Read. Please Swipe Card Now:'
617
+ loop do
618
+ exec_resp = parse_responses(
619
+ msr206_obj: msr206_obj,
620
+ cmd: type
621
+ )
619
622
 
620
- case type
621
- when :arm_to_read,
622
- :arm_to_read_w_speed_prompts
623
+ break if exec_resp[:msg] == :ack_command_completed
624
+ end
623
625
 
624
626
  if encoding == :iso
625
627
  cmds_arr = %i[
@@ -633,6 +635,7 @@ module PWN
633
635
  msr206_obj: msr206_obj,
634
636
  cmd: cmd
635
637
  )
638
+ exec_resp[:encoding] = encoding
636
639
  puts exec_resp[:decoded]
637
640
  puts exec_resp.inspect
638
641
  track_data_arr.push(exec_resp)
@@ -655,6 +658,7 @@ module PWN
655
658
  cmd: cmd,
656
659
  params: [param]
657
660
  )
661
+ exec_resp[:encoding] = encoding
658
662
  puts exec_resp[:decoded]
659
663
  puts exec_resp.inspect
660
664
  track_data_arr.push(exec_resp)
@@ -679,6 +683,7 @@ module PWN
679
683
  cmd: cmd,
680
684
  params: [param]
681
685
  )
686
+ exec_resp[:encoding] = encoding
682
687
  puts exec_resp[:decoded]
683
688
  puts exec_resp.inspect
684
689
  track_data_arr.push(exec_resp)
@@ -689,6 +694,7 @@ module PWN
689
694
  cmd: cmd,
690
695
  params: [0x5f] + [param]
691
696
  )
697
+ exec_resp[:encoding] = encoding
692
698
  puts exec_resp[:decoded]
693
699
  puts exec_resp.inspect
694
700
  track_data_arr.push(exec_resp)
@@ -699,8 +705,86 @@ module PWN
699
705
  :arm_to_write_with_raw,
700
706
  :arm_to_write_with_raw_speed_prompts
701
707
 
702
- cmds_arr = %i[
703
- ]
708
+ if encoding == :iso
709
+ cmds_arr = %i[
710
+ load_iso_std_data_for_writing_track1
711
+ load_iso_std_data_for_writing_track2
712
+ load_iso_std_data_for_writing_track3
713
+ ]
714
+
715
+ cmds_arr.each_with_index do |cmd, track|
716
+ puts "\n*** #{cmd.to_s.gsub('_', ' ').upcase} #{'*' * 17}"
717
+ this_track = track_data[track][:decoded].chars.map do |c|
718
+ c.unpack1('H*').to_i(16)
719
+ end
720
+ this_track_w_eot = this_track + [0x04]
721
+ puts this_track_w_eot.inspect
722
+ exec_resp = exec(
723
+ msr206_obj: msr206_obj,
724
+ cmd: cmd,
725
+ params: this_track_w_eot
726
+ )
727
+ exec_resp[:encoding] = encoding
728
+ puts exec_resp[:decoded]
729
+ puts exec_resp.inspect
730
+ track_data_arr.push(exec_resp)
731
+ end
732
+ end
733
+
734
+ # if encoding == :iso_alt
735
+ # cmds_arr = %i[
736
+ # alt_load_iso_std_data_for_writing_track1
737
+ # alt_load_iso_std_data_for_writing_track2
738
+ # alt_load_iso_std_data_for_writing_track3
739
+ # ]
740
+
741
+ # cmds_arr.each do |cmd|
742
+ # puts "\n*** #{cmd.to_s.gsub('_', ' ').upcase} #{'*' * 17}"
743
+ # exec_resp = exec(
744
+ # msr206_obj: msr206_obj,
745
+ # cmd: cmd
746
+ # )
747
+ # exec_resp[:encoding] = encoding
748
+ # puts exec_resp[:decoded]
749
+ # puts exec_resp.inspect
750
+ # track_data_arr.push(exec_resp)
751
+ # end
752
+ # end
753
+
754
+ # if encoding == :raw
755
+ # cmds_arr = %i[
756
+ # load_custom_data_for_writing_track1
757
+ # load_custom_data_for_writing_track2
758
+ # load_custom_data_for_writing_track3
759
+ # ]
760
+
761
+ # cmds_arr.each do |cmd|
762
+ # puts "\n*** #{cmd.to_s.gsub('_', ' ').upcase} #{'*' * 17}"
763
+ # exec_resp = exec(
764
+ # msr206_obj: msr206_obj,
765
+ # cmd: cmd
766
+ # )
767
+ # exec_resp[:encoding] = encoding
768
+ # puts exec_resp[:decoded]
769
+ # puts exec_resp.inspect
770
+ # track_data_arr.push(exec_resp)
771
+ # end
772
+ # end
773
+
774
+ exec_resp = PWN::Plugins::MSR206.exec(
775
+ msr206_obj: msr206_obj,
776
+ cmd: type
777
+ )
778
+
779
+ print 'Ready to Write. Please Swipe Card Now:'
780
+ loop do
781
+ exec_resp = parse_responses(
782
+ msr206_obj: msr206_obj,
783
+ cmd: type
784
+ )
785
+
786
+ break if exec_resp[:msg] == :ack_command_completed
787
+ end
704
788
  else
705
789
  raise "ERROR Unsupported type in #wait_for_swipe - #{type}"
706
790
  end
@@ -718,7 +802,6 @@ module PWN
718
802
  # Supported Method Parameters::
719
803
  # PWN::Plugins::MSR206.read_card(
720
804
  # msr206_obj: 'required - msr206_obj returned from #connect method'
721
- # type: 'required - swipe type :arm_to_read || :arm_to_read_w_speed_prompts || :arm_to_write_no_raw || :arm_to_write_with_raw || :arm_to_write_with_raw_speed_prompts',
722
805
  # )
723
806
 
724
807
  public_class_method def self.read_card(opts = {})
@@ -749,9 +832,240 @@ module PWN
749
832
 
750
833
  wait_for_swipe(
751
834
  msr206_obj: msr206_obj,
752
- type: type,
835
+ type: :arm_to_read,
836
+ encoding: encoding
837
+ )
838
+ rescue StandardError => e
839
+ raise e
840
+ end
841
+
842
+ # Supported Method Parameters::
843
+ # PWN::Plugins::MSR206.backup_card(
844
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
845
+ # )
846
+
847
+ public_class_method def self.backup_card(opts = {})
848
+ msr206_obj = opts[:msr206_obj]
849
+ type = opts[:type].to_s.scrub.strip.chomp.to_sym
850
+
851
+ # Read Card to Backup
852
+ track_data = read_card(
853
+ msr206_obj: msr206_obj
854
+ )
855
+
856
+ file = ''
857
+ backup_msg = ''
858
+ loop do
859
+ if backup_msg.empty?
860
+ exec_resp = exec(
861
+ msr206_obj: msr206_obj,
862
+ cmd: :green_flash
863
+ )
864
+ end
865
+
866
+ print 'Enter File Name to Save Backup: '
867
+ file = gets.scrub.chomp.strip
868
+ file_dir = File.dirname(file)
869
+ break if Dir.exist?(file_dir)
870
+
871
+ backup_msg = "\n****** ERROR: Directory #{file_dir} for #{file} does not exist ******"
872
+ puts backup_msg
873
+ exec_resp = exec(
874
+ msr206_obj: msr206_obj,
875
+ cmd: :green_off
876
+ )
877
+ exec_resp = exec(
878
+ msr206_obj: msr206_obj,
879
+ cmd: :yellow_flash
880
+ )
881
+ end
882
+
883
+ File.write(file, "#{track_data.to_json}\n")
884
+ exec_resp = exec(
885
+ msr206_obj: msr206_obj,
886
+ cmd: :yellow_off
887
+ )
888
+
889
+ puts 'complete.'
890
+
891
+ track_data
892
+ rescue StandardError => e
893
+ raise e
894
+ end
895
+
896
+ # Supported Method Parameters::
897
+ # PWN::Plugins::MSR206.copy_card(
898
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
899
+ # )
900
+
901
+ public_class_method def self.copy_card(opts = {})
902
+ msr206_obj = opts[:msr206_obj]
903
+
904
+ # Read Card to Backup
905
+ track_data = backup_card(
906
+ msr206_obj: msr206_obj
907
+ )
908
+
909
+ encoding = track_data.first[:encoding] if track_data.length == 3
910
+ # TODO: Save Original Card Contents
911
+ track_data = wait_for_swipe(
912
+ msr206_obj: msr206_obj,
913
+ type: :arm_to_write_no_raw,
914
+ encoding: encoding,
915
+ track_data: track_data
916
+ )
917
+
918
+ puts 'complete.'
919
+
920
+ track_data
921
+ rescue StandardError => e
922
+ raise e
923
+ end
924
+
925
+ # Supported Method Parameters::
926
+ # PWN::Plugins::MSR206.load_card_from_file(
927
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
928
+ # )
929
+
930
+ public_class_method def self.load_card_from_file(opts = {})
931
+ msr206_obj = opts[:msr206_obj]
932
+
933
+ file = ''
934
+ restore_msg = ''
935
+ loop do
936
+ if restore_msg.empty?
937
+ exec_resp = exec(
938
+ msr206_obj: msr206_obj,
939
+ cmd: :green_flash
940
+ )
941
+ end
942
+
943
+ print 'Enter File Name to Restore to Card: '
944
+ file = gets.scrub.chomp.strip
945
+ break if File.exist?(file)
946
+
947
+ restore_msg = "\n****** ERROR: #{file} does not exist ******"
948
+ puts restore_msg
949
+ exec_resp = exec(
950
+ msr206_obj: msr206_obj,
951
+ cmd: :green_off
952
+ )
953
+ exec_resp = exec(
954
+ msr206_obj: msr206_obj,
955
+ cmd: :yellow_flash
956
+ )
957
+ end
958
+
959
+ track_data = JSON.parse(
960
+ File.read(file),
961
+ symbolize_names: true
962
+ )
963
+
964
+ exec_resp = exec(
965
+ msr206_obj: msr206_obj,
966
+ cmd: :yellow_off
967
+ )
968
+
969
+ # Read Card from Backup
970
+ encoding = track_data.first[:encoding] if track_data.length == 3
971
+
972
+ # TODO: Save Original Card Contents
973
+ track_data = wait_for_swipe(
974
+ msr206_obj: msr206_obj,
975
+ type: :arm_to_write_no_raw,
976
+ encoding: encoding,
977
+ track_data: track_data
978
+ )
979
+
980
+ puts 'complete.'
981
+
982
+ track_data
983
+ rescue StandardError => e
984
+ raise e
985
+ end
986
+
987
+ # Supported Method Parameters::
988
+ # PWN::Plugins::MSR206.edit_card(
989
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
990
+ # )
991
+
992
+ public_class_method def self.edit_card(opts = {})
993
+ msr206_obj = opts[:msr206_obj]
994
+
995
+ # Read Card to Backup
996
+ track_data = backup_card(
997
+ msr206_obj: msr206_obj
998
+ )
999
+
1000
+ # TODO: Inline Editing
1001
+
1002
+ encoding = track_data.first[:encoding] if track_data.length == 3
1003
+ # TODO: Save Original Card Contents
1004
+ track_data = wait_for_swipe(
1005
+ msr206_obj: msr206_obj,
1006
+ type: :arm_to_write_no_raw,
753
1007
  encoding: encoding
754
1008
  )
1009
+
1010
+ puts 'complete.'
1011
+
1012
+ track_data
1013
+ rescue StandardError => e
1014
+ raise e
1015
+ end
1016
+
1017
+ # Supported Method Parameters::
1018
+ # PWN::Plugins::MSR206.get_config(
1019
+ # msr206_obj: 'required - msr206_obj returned from #connect method'
1020
+ # )
1021
+
1022
+ public_class_method def self.get_config(opts = {})
1023
+ msr206_obj = opts[:msr206_obj]
1024
+
1025
+ # --------------------------------------------------
1026
+ # Bit|Bit = 0 |Bit = 1
1027
+ # --------------------------------------------------
1028
+ # 0 |Track 1 Read not present |Track 1 Read present
1029
+ # 1 |Track 2 Read not present |Track 2 Read present
1030
+ # 2 |Track 3 Read not present |Track 3 Read present
1031
+ # 3 |not used – should be 0 |not used
1032
+ # 4 |Track 3 Write not present|Track 3 Write present
1033
+ # 5 |Track 2 Write not present|Track 2 Write present
1034
+ # 6 |Track 1 Write not present|Track 1 Write present
1035
+ # 7 |parity bit** |parity bit**
1036
+ exec_resp = PWN::Plugins::MSR206.exec(
1037
+ msr206_obj: msr206_obj,
1038
+ cmd: :configuration_request
1039
+ )
1040
+
1041
+ config_arr = exec_resp[:binary].first.reverse.chars
1042
+ config_hash = {}
1043
+ config_arr.each_with_index do |bit_str, i|
1044
+ bit = bit_str.to_i
1045
+ config_hash[:track1_read] = false if bit.zero? && i.zero?
1046
+ config_hash[:track1_read] = true if bit == 1 && i.zero?
1047
+
1048
+ config_hash[:track2_read] = false if bit.zero? && i == 1
1049
+ config_hash[:track2_read] = true if bit == 1 && i == 1
1050
+
1051
+ config_hash[:track3_read] = false if bit.zero? && i == 2
1052
+ config_hash[:track3_read] = true if bit == 1 && i == 2
1053
+
1054
+ config_hash[:not_used] if i == 3
1055
+
1056
+ config_hash[:track1_write] = false if bit.zero? && i == 4
1057
+ config_hash[:track1_write] = true if bit == 1 && i == 4
1058
+
1059
+ config_hash[:track2_write] = false if bit.zero? && i == 5
1060
+ config_hash[:track2_write] = true if bit == 1 && i == 5
1061
+
1062
+ config_hash[:track3_write] = false if bit.zero? && i == 6
1063
+ config_hash[:track3_write] = true if bit == 1 && i == 6
1064
+
1065
+ config_hash[:parity] = true if bit == 1 && i == 7
1066
+ end
1067
+
1068
+ config_hash
755
1069
  rescue StandardError => e
756
1070
  raise e
757
1071
  end
data/lib/pwn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.4.477'
4
+ VERSION = '0.4.478'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.477
4
+ version: 0.4.478
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -310,14 +310,14 @@ dependencies:
310
310
  requirements:
311
311
  - - '='
312
312
  - !ruby/object:Gem::Version
313
- version: 2.3.0
313
+ version: 2.4.0
314
314
  type: :runtime
315
315
  prerelease: false
316
316
  version_requirements: !ruby/object:Gem::Requirement
317
317
  requirements:
318
318
  - - '='
319
319
  - !ruby/object:Gem::Version
320
- version: 2.3.0
320
+ version: 2.4.0
321
321
  - !ruby/object:Gem::Dependency
322
322
  name: luhn
323
323
  requirement: !ruby/object:Gem::Requirement