Linux、MacOS、Windows:
スマートカード通信のためのPC/SC APIへの錆のバインディング。
詳細については、ドキュメントを参照してください。
いくつかの一般的なタスクについては、 pcsc/examples
ディレクトリを参照してください。
pcsc-sys
クレートには、C APIへの直接的な低レベルのバインディングが含まれています。
pcsc
クレートには、高レベルのラストラッパーが含まれています。
あなたのCargo.toml
で:toml:
[ dependencies ]
pcsc = " 2 "
最初の利用可能なリーダーのカードに接続し、カードにAPDUコマンドを送信し、APDU応答を印刷します。
use pcsc :: * ;
fn main ( ) {
// Establish a PC/SC context.
let ctx = match Context :: establish ( Scope :: User ) {
Ok ( ctx ) => ctx ,
Err ( err ) => {
eprintln ! ( "Failed to establish context: {}" , err ) ;
std :: process :: exit ( 1 ) ;
}
} ;
// List available readers.
let mut readers_buf = [ 0 ; 2048 ] ;
let mut readers = match ctx . list_readers ( & mut readers_buf ) {
Ok ( readers ) => readers ,
Err ( err ) => {
eprintln ! ( "Failed to list readers: {}" , err ) ;
std :: process :: exit ( 1 ) ;
}
} ;
// Use the first reader.
let reader = match readers . next ( ) {
Some ( reader ) => reader ,
None => {
println ! ( "No readers are connected." ) ;
return ;
}
} ;
println ! ( "Using reader: {:?}" , reader ) ;
// Connect to the card.
let card = match ctx . connect ( reader , ShareMode :: Shared , Protocols :: ANY ) {
Ok ( card ) => card ,
Err ( Error :: NoSmartcard ) => {
println ! ( "A smartcard is not present in the reader." ) ;
return ;
}
Err ( err ) => {
eprintln ! ( "Failed to connect to card: {}" , err ) ;
std :: process :: exit ( 1 ) ;
}
} ;
// Send an APDU command.
let apdu = b" x00 xa4 x04 x00 x0A xA0 x00 x00 x00 x62 x03 x01 x0C x06 x01 " ;
println ! ( "Sending APDU: {:?}" , apdu ) ;
let mut rapdu_buf = [ 0 ; MAX_BUFFER_SIZE ] ;
let rapdu = match card . transmit ( apdu , & mut rapdu_buf ) {
Ok ( rapdu ) => rapdu ,
Err ( err ) => {
eprintln ! ( "Failed to transmit APDU command to card: {}" , err ) ;
std :: process :: exit ( 1 ) ;
}
} ;
println ! ( "APDU response: {:?}" , rapdu ) ;
}
出力の例:
$ ./target/debug/examples/readme
Using reader: "SCM Microsystems Inc. SCR 355 [CCID Interface] 00 00"
Sending APDU: [0, 164, 4, 0, 10, 160, 0, 0, 0, 98, 3, 1, 12, 6, 1]
APDU response: [106, 130]
MITライセンス。