pwn 0.4.477 → 0.4.478

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 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