Culjko
Member
Hi
Has anyone here tried to read public and private keys from a smart card reader. i write code to open and transmit APDU commands to smart card, but I also need to read public and private key.
With this code I read and send APDU commands to the card. Is there a way to read the certificate from the smart card?
Has anyone here tried to read public and private keys from a smart card reader. i write code to open and transmit APDU commands to smart card, but I also need to read public and private key.
With this code I read and send APDU commands to the card. Is there a way to read the certificate from the smart card?
Card Reader:
Sub Class_Globals
' ************
' JAVA VARS
'*************
Dim uManager As UsbManager
Dim uDevice As UsbDevice
Dim mReader As JavaObject
Dim device As JavaObject
Dim Manager As JavaObject
Dim Reader As JavaObject
Private EventName As String 'ignore
Private CallBack As Object 'ignore
Dim openState As Boolean
Dim readerState As Boolean = False
Dim slotNum As Int
Dim prevState As Int
Dim currState As Int
Dim getState As Int
Dim Unknown As Int
Dim Absent As Int
Dim Present As Int
Dim Undefined As Int
Dim SWA As String = ""
Dim SWB As String = ""
Dim numberOfUsb As Int = 0
Dim error As Boolean = False
Dim init As Boolean = False
Dim usbdevices() As UsbDevice
Dim CARD_POWER_DOWN As Int = 0
Dim CARD_COLD_RESET As Int = 1
Dim CARD_WARM_RESET As Int = 2
Dim PROTOCOL_UNDEFINED As Int = 0
Dim PROTOCOL_T0 As Int = 1
Dim PROTOCOL_T1 As Int = 2
Dim PROTOCOL_RAW As Int = 65536
Dim PROTOCOL_TX As Int = 3
Dim PROTOCOL_DEFAULT As Int = -2147483648
Dim PROTOCOL_OPTIMAL As Int = 0
Dim CARD_UNKNOWN As Int = 0
Dim CARD_ABSENT As Int = 1
Dim CARD_PRESENT As Int = 2
Dim CARD_SWALLOWED As Int = 3
Dim CARD_POWERED As Int = 4
Dim CARD_NEGOTIABLE As Int = 5
Dim CARD_SPECIFIC As Int = 6
Dim IOCTL_CCID_ESCAPE As Int = 3500
Dim IOCTL_ACR128_READER_COMMAND As Int = 2079
Dim IOCTL_ACR83_GET_FIRMWARE_VERSION As Int = 2078
Dim IOCTL_ACR83_DISPLAY_LCD_MESSAGE As Int = 2079
Dim IOCTL_ACR83_READ_KEY As Int = 2080
Dim IOCTL_GET_FEATURE_REQUEST As Int = 3400
Dim receiveLenght As Int = 0
Private CallBackObj As Object
Dim VUD As Boolean = False
Dim cEvent As Boolean = False
Dim usbDeviceName As String = ""
Dim errorMessage As String = ""
Dim errorCode As String = ""
Dim card As JavaObject
Dim SCard As CkCert
End Sub
'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize(vCallback As Object, vEventName As String) As Boolean
Log(init)
If init Then Return True
mReader.InitializeContext
Reader.InitializeContext
device.InitializeContext
uManager.Initialize
usbdevices = uManager.GetDevices
VUD = verificaUsbDevice
EventName = vEventName
CallBack = vCallback
GetBA
If SetUpReader Then
init = True
Return True
End If
init = False
Return False
End Sub
Sub SetUpReader As Boolean
Try
If Not(VUD) Then verificaUsbDevice
Dim NR As Boolean = NewReader
If VUD And NR Then
init = True
readerState = True
Starter.errorStatus("0000","")
Return True
Else
Starter.errorStatus("1300","")
init = False
readerState = False
Return False
End If
Catch
Log(LastException)
init = False
readerState = False
Starter.errorStatus("1300","")
Return False
End Try
init = False
readerState = False
Return False
End Sub
Sub initialized As Boolean
Return init
End Sub
Sub NewReader As Boolean
'If Not (readerState) Then Return False
Private jo As JavaObject
jo.InitializeContext
Manager= GetContext.RunMethod("getSystemService", Array("usb"))
mReader = jo.InitializeNewInstance ("com.acs.smartcard.Reader",Array As Object (Manager))
CreateEvent
Return True
End Sub
Sub CreateEvent As JavaObject
Log("create event")
'Private CallBackObj As Object
'If Not (cEvent) Then Return
CallBackObj=mReader.CreateEvent ("com.acs.smartcard.Reader.OnStateChangeListener", "status", Null)
Private cObject As Object = mReader.RunMethod("setOnStateChangeListener",Array As Object (CallBackObj))
cEvent = True
Return True
End Sub
Sub OpenReader As Boolean
errorMessage = ""
errorCode = ""
If Not(init) Then Return False
Private jo As JavaObject
jo.InitializeContext
Log(mReader.RunMethod ("isSupported",Array As Object(uDevice)))
Manager= GetContext.RunMethod("getSystemService", Array("usb"))
Try
device = jo.InitializeNewInstance ("com.acs.smartcard.Reader",Array As Object (Manager))
card = mReader.RunMethod ("open",Array As Object(uDevice))
Dim isOpen As Boolean = mReader.RunMethod ("isOpened",Null)
Starter.errorStatus("0000","")
Catch
Log("greska not open")
Starter.errorStatus("1300","")
readerState = False
Return False
End Try
Log(isOpen)
If isOpen Then
powerCard(CARD_WARM_RESET)
setProtocol(PROTOCOL_T1)
openState = True
Return True
Else
openState = False
CloseReader
Return False
End If
Return False
End Sub
Sub powerCard(cardattr As Int) As Int
Try
mReader.RunMethod ("power",Array (slotNum, cardattr))
Starter.errorStatus("0000","")
Catch
Starter.errorStatus("1300","")
CloseReader
openState = False
readerState = False
init = False
Log(LastException)
End Try
End Sub
Sub ReaderPresent
usbdevices = uManager.GetDevices
numberOfUsb = usbdevices.Length
If numberOfUsb = 0 Then
openState = False
readerState = False
init = False
Return False
End If
Return True
End Sub
Sub CloseReader As JavaObject
Log("close reader")
If Not (openState) Then Return
openState = False
mReader.RunMethod ("close",Null)
End Sub
Sub status_event(MethodName As String, Args() As Object) As Object
Log("event")
'Private slotNum As Int=Args(0)
Private prevState As Int=Args(1)
Private currState As Int=Args(2)
Private getState1 As Object
Private Unknown As Int=mReader.GetField ("CARD_UNKNOWN")
Private Absent As Int =mReader.GetField ("CARD_ABSENT")
Private Present As Int =mReader.GetField ("CARD_PRESENT")
Private Undefined As Int=mReader.GetField ("PROTOCOL_UNDEFINED")
Log( mReader.GetField ("CARD_UNKNOWN") )
Log( mReader )
'getState1=mReader.RunMethod ("getState", Array As Object (slotNum))
If currState=Unknown Then
Msgbox("Card Unknown","Status")
End If
Log(prevState)
Log(currState)
If prevState > currState And currState<>Unknown Then
Msgbox ("Card Removed","Status")
Else
If currState<>Unknown Then
Log("kartica nepoznata")
End If
End If
End Sub
Public Sub getStateReader As Int
Dim ud As UsbDevice
numberOfUsb = usbdevices.Length
Log(numberOfUsb)
If numberOfUsb = 0 Then
readerState = False
openState = False
Return -2
End If
ud = usbdevices(slotNum)
Try
Log(ud.DeviceName)
Catch
readerState = False
openState = False
Return -2
End Try
If uManager.HasPermission(uDevice) = False Then
readerState = False
openState = False
Return -1
End If
' = usbdevices(slotNum)
' Log(ud.DeviceName)
Return 0
If Not (readerState) Then Return 2
If Not (openState) Then Return 3
Try
Return mReader.RunMethod ("getState", Array As Object (slotNum))
Catch
Log(LastException)
Dim errormsg As String = LastException
If errormsg.IndexOf("The reader is not opened.") Then Return 1
End Try
Return 0
End Sub
Sub devicesNumber As Int
usbdevices = uManager.GetDevices
' Log("device number " & usbdevices.Length)
If usbdevices.Length = 0 Or Not(readerState) Then
Dim resetvars() As Byte
' Starter.TaxCorePublicKey = resetvars
' Starter.Certificate = resetvars
If verificaUsbDevice Then
readerState = True
Else
readerState = False
init = False
openState = False
End If
End If
Return usbdevices.Length
End Sub
Sub verificaUsbDevice As Boolean
usbdevices = uManager.GetDevices
numberOfUsb = usbdevices.Length
If usbdevices.Length = 0 Then Return False
For i = 0 To usbdevices.Length - 1
' Dim ud As UsbDevice
Dim ud As UsbDevice = usbdevices(i)
Dim inter As UsbInterface
inter = ud.GetInterface(i)
uDevice = ud
Log(i)
If inter.InterfaceClass = 11 And inter.InterfaceSubclass = 0 Then
'found our device and interface
''interface = inter
uDevice = ud
Log(uDevice.DeviceName)
slotNum = i
'Find correct endpoints
' For b = 0 To interface.EndpointCount - 1
' Dim endpoint As UsbEndpoint
' endpoint = interface.GetEndpoint(b)
' If endpoint.Type = Manager.USB_ENDPOINT_XFER_BULK Then
' If endpoint.Direction = Manager.USB_DIR_IN Then
' inEndpoint = endpoint
' Else If endpoint.Direction = Manager.USB_DIR_OUT Then
' outEndpoint = endpoint
' End If
' End If
' Next
End If
Next
If uManager.HasPermission(uDevice) = False Then
uManager.RequestPermission(uDevice)
Return False
End If
Return True
End Sub
Sub transmit(cmd() As Byte) As Byte()
If readerState = False Or init = False Or openState = False Then
readerState = False
init = False
openState = False
Return Array As Byte()
End If
Log("transmit")
error = False
Dim recvBuffer(2048) As Byte
Dim adpuAnswer() As Byte
Try
Dim receiveLenght As Int = mReader.RunMethod ("transmit",Array(slotNum, cmd, cmd.Length, recvBuffer, recvBuffer.Length))
Catch
Log(LastException)
readerState = False
init = False
openState = False
receiveLenght = 0
Return Array As Byte()
End Try
If receiveLenght = 0 Then Return adpuAnswer
Dim Switch As String = bytesToHexString(CopyArray(recvBuffer, receiveLenght-2, 2))
adpuAnswer = CopyArray(recvBuffer, 0, receiveLenght-2)
Log("OVO je vraceno " & bytesToHexString(recvBuffer))
SWA = Switch.SubString2(Switch.Length-4, Switch.Length-2)
SWB = Switch.SubString(Switch.Length-2)
Log(SWA)
Log(SWB)
Starter.errorStatus(SWA&SWB,"")
If bytesToHexString(adpuAnswer) <> "9000" Or receiveLenght = 0 Then
error = True
End If
Return adpuAnswer
End Sub