WSCT Core
1.0.0
พื้นที่เก็บข้อมูลสาธารณะสำหรับโครงการ WSCT Core
พัฒนาโดย S.Vernois @ ENSICAEN / GREYC ตั้งแต่ปี 2549 ด้วยความช่วยเหลือจากนักเรียนบางคนในการพิสูจน์แนวคิด
เอกสาร WSCT Core API มีอยู่ใน URL นี้: http://wsct.github.io/WSCT-Core
นี่คือ API หลักของโปรเจ็กต์นี้ มันกำหนด:
คำเตือน: แพ็คเกจนี้เพียงอย่างเดียวไม่ได้ให้การเข้าถึงเครื่องอ่านสมาร์ทการ์ดที่เป็นรูปธรรม ใช้แพ็คเกจถัดไปสำหรับสิ่งนั้น
แพ็คเกจนี้รวมไลบรารี PC/SC ดั้งเดิมเข้าด้วยกันอย่างแนบเนียน
ระบบปฏิบัติการที่รองรับ:
// Connect to PC/SC
var context = new CardContext ( ) ;
context . Establish ( ) ;
// Get installed readers
context . ListReaders ( " " ) ;
var allReaders = context . Readers ;
// Connect to an ISO7816-4 card in the last reader found
var channel = new CardChannel ( context , context . Readers . Last ( ) ) ;
channel . Connect ( ShareMode . Exclusive , Protocol . Any ) ;
// Build a SELECT command
var capdu = new SelectCommand (
SelectCommand . SelectionMode . SelectDFName ,
SelectCommand . FileOccurrence . FirstOrOnly ,
SelectCommand . FileControlInformation . ReturnFci ,
" A0 00 00 01 51 " . FromHexa ( )
) ;
// Send it in a CRP an get the response back
var crp = new CommandResponsePair ( capdu ) ;
crp . Transmit ( channel ) ;
var rapdu = crp . RApdu ;
// Unpower the card
channel . Disconnect ( Disposition . UnpowerCard ) ;
// Disconnect from PC/SC
context . Release ( ) ;
วิธีการขยายบางวิธีที่อยู่ในเนมสเปซ WSCT.Core.Fluent.Helpers สามารถใช้เพื่อทำให้การสร้างต้นแบบง่ายขึ้น (ล้มเหลวอย่างรวดเร็วและล้มเหลวอย่างปลอดภัยในขณะที่เขียนโค้ดน้อยลง):
CardContext ? cardContext = null ;
CardChannel ? cardChannel = null ;
try
{
// Connect to PC/SC
cardContext = new new CardContext ( ) ;
cardContext
. Establish ( )
. ThrowIfNotSuccess ( ) ;
cardContext
. ListReaderGroups ( )
. ThrowIfNotSuccess ( ) ;
cardContext
. ListReaders ( cardContext . Groups [ 0 ] )
. ThrowIfNotSuccess ( ) ;
cardChannel = new CardChannel ( cardContext , cardContext . Readers [ 0 ] ) ;
new CommandAPDU ( " 00 A4 04 00 07 F0 57 53 43 54 2E 30 " )
. Transmit ( cardChannel )
. ThrowIfNotSuccess ( )
. ThrowIfSWNot9000 ( )
. If ( r => r . Sw1 == 0x61 , ( c , r ) => Console . WriteLine ( $" { r . Sw2 } bytes are waiting to be retrieved " ) ) ;
new CommandAPDU ( " 00 C0 00 00 08 " )
. Transmit ( cardChannel )
. ThrowIfNotSuccess ( )
. ThrowIfSWNot9000 ( ) ;
}
finally
{
cardChannel ?
. Disconnect ( Disposition . UnpowerCard ) ;
cardContext ?
. Release ( ) ;
}