copy client works
This commit is contained in:
parent
ff8688bf85
commit
d6978777d4
|
@ -27,6 +27,8 @@ class Copy
|
||||||
|
|
||||||
# to show the exact file being processed
|
# to show the exact file being processed
|
||||||
VERBOSE = false
|
VERBOSE = false
|
||||||
|
# show file discovery progress
|
||||||
|
PROGRESS = true
|
||||||
|
|
||||||
# create a Copy class
|
# create a Copy class
|
||||||
# io : I/O to the SAP server
|
# io : I/O to the SAP server
|
||||||
|
@ -46,6 +48,176 @@ class Copy
|
||||||
@sim = XML::Node.new("sim")
|
@sim = XML::Node.new("sim")
|
||||||
# get the ATR
|
# get the ATR
|
||||||
@sim["atr"] = @client.atr.to_hex
|
@sim["atr"] = @client.atr.to_hex
|
||||||
|
|
||||||
|
# verify CHV1
|
||||||
|
while chv_enabled? do
|
||||||
|
|
||||||
|
print "enter PIN : "
|
||||||
|
STDOUT.flush
|
||||||
|
pin = gets.chomp
|
||||||
|
# pin is between 4 and 8 digits
|
||||||
|
unless pin.length>=4 and pin.length<=8 and pin.gsub(/\d/,"").length==0 then
|
||||||
|
puts "PIN has 4 to 8 digits"
|
||||||
|
redo
|
||||||
|
end
|
||||||
|
|
||||||
|
# encode pin in T.50 on 8 bytes
|
||||||
|
chv = [0xFF]*8
|
||||||
|
pin.length.times do |i|
|
||||||
|
chv[i]=0x30+pin[i,1].to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
# select DF_GSM
|
||||||
|
cd [MF,DF_GSM]
|
||||||
|
# verify CHV1
|
||||||
|
begin
|
||||||
|
transmit(CHV1+chv)
|
||||||
|
@sim["CHV1"]=pin
|
||||||
|
break
|
||||||
|
rescue
|
||||||
|
puts "PIN wrong"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# get MF
|
||||||
|
puts "reading SIM files"
|
||||||
|
mf = explore([MF])
|
||||||
|
@sim << mf
|
||||||
|
puts "" if PROGRESS and !VERBOSE
|
||||||
|
puts "found #{@nb_directories} directories and #{@nb_files} files"
|
||||||
|
|
||||||
|
# get some tuples (run A38 algo)
|
||||||
|
puts "getting some A38 tuples"
|
||||||
|
a38_node = XML::Node.new("a38")
|
||||||
|
# the rands
|
||||||
|
rands = []
|
||||||
|
16.times do |i|
|
||||||
|
rands << [(i<<4)+i]*16
|
||||||
|
end
|
||||||
|
# the results
|
||||||
|
rands.each do |r|
|
||||||
|
response = a38(r)
|
||||||
|
tuple_node = XML::Node.new("tuple")
|
||||||
|
tuple_node["rand"]=r.to_hex
|
||||||
|
tuple_node["sres"]=response[0,4].to_hex
|
||||||
|
tuple_node["kc"]=response[4..-1].to_hex
|
||||||
|
a38_node << tuple_node
|
||||||
|
end
|
||||||
|
@sim << a38_node
|
||||||
|
|
||||||
|
# write xml in file
|
||||||
|
puts "saving SIM files in #{file}"
|
||||||
|
xml = XML::Document.new
|
||||||
|
xml.root = @sim
|
||||||
|
xml.save(file)
|
||||||
|
end
|
||||||
|
|
||||||
|
# return the file
|
||||||
|
# - id : file ID
|
||||||
|
# return {:id,:type,:name,:structure,:header,:body}, or nil if file does not exist
|
||||||
|
def file(id)
|
||||||
|
|
||||||
|
# the data to return
|
||||||
|
to_return = {}
|
||||||
|
|
||||||
|
# select file
|
||||||
|
begin
|
||||||
|
response = select(id)
|
||||||
|
rescue Exception => e
|
||||||
|
if e.to_s.include? "file ID not found/pattern not found" then
|
||||||
|
return nil
|
||||||
|
else
|
||||||
|
raise e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
to_return[:header] = response
|
||||||
|
# file id
|
||||||
|
to_return[:id] = [response[4],response[5]]
|
||||||
|
to_return[:name]=FILE_ID[(to_return[:id][0]<<8)+to_return[:id][1]]
|
||||||
|
# file type
|
||||||
|
type = case response[6]
|
||||||
|
when 0
|
||||||
|
"RFU"
|
||||||
|
when 1
|
||||||
|
"MF"
|
||||||
|
when 2
|
||||||
|
"DF"
|
||||||
|
when 4
|
||||||
|
"EF"
|
||||||
|
else
|
||||||
|
"unknown"
|
||||||
|
end
|
||||||
|
to_return[:type] = type
|
||||||
|
|
||||||
|
# read EF
|
||||||
|
if response[6]==0x04 then
|
||||||
|
|
||||||
|
# structure
|
||||||
|
structure = case response[13]
|
||||||
|
when 0
|
||||||
|
"transparent"
|
||||||
|
when 1
|
||||||
|
"linear fixed"
|
||||||
|
when 3
|
||||||
|
"cyclic"
|
||||||
|
else
|
||||||
|
"unknown"
|
||||||
|
end
|
||||||
|
to_return[:structure] = structure
|
||||||
|
|
||||||
|
# do I have the right to read ?
|
||||||
|
nibble = (response[8]>>4)&0x0f
|
||||||
|
read_right = (nibble==0 or nibble==1)
|
||||||
|
|
||||||
|
if read_right then
|
||||||
|
size = (response[2]<<8)+response[3]
|
||||||
|
# read ef (depending on the type of file)
|
||||||
|
if response[13]==0x00 then # transparent file (TS 51.011 9.3)
|
||||||
|
response = transmit(READ_BINARY+[0x00,0x00]+[size&0xFF])[0]
|
||||||
|
to_return[:body] = response
|
||||||
|
if size>0xFF then
|
||||||
|
response = transmit(READ_BINARY+[0x01, 0x00]+[(size>>8)&0xFF])[0]
|
||||||
|
to_return[:body] += response
|
||||||
|
end
|
||||||
|
else # linear fixed or cyclic
|
||||||
|
record_size = response[14]
|
||||||
|
to_return[:body] = []
|
||||||
|
# read all records
|
||||||
|
(1..size/record_size).each do |i|
|
||||||
|
response = transmit(READ_RECORD+[i,0x04,record_size])[0]
|
||||||
|
to_return[:body] << response
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
return to_return
|
||||||
|
end
|
||||||
|
|
||||||
|
# returns a node from the file data
|
||||||
|
def file2node(data)
|
||||||
|
|
||||||
|
node = XML::Node.new("file")
|
||||||
|
node["id"]=data[:id].to_hex
|
||||||
|
node["name"]=data[:name] if data[:name]
|
||||||
|
node["type"]=data[:type]
|
||||||
|
node << XML::Node.new("header",data[:header].to_hex)
|
||||||
|
if data[:type]=="EF" then
|
||||||
|
node["structure"]=data[:structure]
|
||||||
|
if data[:body] then# if I can read the body
|
||||||
|
if data[:structure]=="transparent" then
|
||||||
|
node << XML::Node.new("body",data[:body].to_hex)
|
||||||
|
else # linear fixed or cyclic
|
||||||
|
body_node = XML::Node.new("body")
|
||||||
|
data[:body].each do |record|
|
||||||
|
body_node << XML::Node.new("record",record.to_hex)
|
||||||
|
end
|
||||||
|
node << body_node
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return node
|
||||||
end
|
end
|
||||||
|
|
||||||
# get all the files in the current directory
|
# get all the files in the current directory
|
||||||
|
|
Loading…
Reference in New Issue