scard

package module
v0.0.0-...-c789db0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 8, 2021 License: BSD-2-Clause Imports: 3 Imported by: 0

README

scard

GoDoc

Go bindings to the PC/SC API.

Installation

go get -u github.com/ebfe/scard

Bugs

- Memory layouts/GC/cgo rules needs a thorough review.

Documentation

Overview

Package scard provides bindings to the PC/SC API.

Example
package main

import (
	"fmt"
	"github.com/ebfe/scard"
	"os"
)

func die(err error) {
	fmt.Println(err)
	os.Exit(1)
}

func waitUntilCardPresent(ctx *scard.Context, readers []string) (int, error) {
	rs := make([]scard.ReaderState, len(readers))
	for i := range rs {
		rs[i].Reader = readers[i]
		rs[i].CurrentState = scard.StateUnaware
	}

	for {
		for i := range rs {
			if rs[i].EventState&scard.StatePresent != 0 {
				return i, nil
			}
			rs[i].CurrentState = rs[i].EventState
		}
		err := ctx.GetStatusChange(rs, -1)
		if err != nil {
			return -1, err
		}
	}
}

func main() {

	// Establish a context
	ctx, err := scard.EstablishContext()
	if err != nil {
		die(err)
	}
	defer ctx.Release()

	// List available readers
	readers, err := ctx.ListReaders()
	if err != nil {
		die(err)
	}

	fmt.Printf("Found %d readers:\n", len(readers))
	for i, reader := range readers {
		fmt.Printf("[%d] %s\n", i, reader)
	}

	if len(readers) > 0 {

		fmt.Println("Waiting for a Card")
		index, err := waitUntilCardPresent(ctx, readers)
		if err != nil {
			die(err)
		}

		// Connect to card
		fmt.Println("Connecting to card in ", readers[index])
		card, err := ctx.Connect(readers[index], scard.ShareExclusive, scard.ProtocolAny)
		if err != nil {
			die(err)
		}
		defer card.Disconnect(scard.ResetCard)

		fmt.Println("Card status:")
		status, err := card.Status()
		if err != nil {
			die(err)
		}

		fmt.Printf("\treader: %s\n\tstate: %x\n\tactive protocol: %x\n\tatr: % x\n",
			status.Reader, status.State, status.ActiveProtocol, status.Atr)

		var cmd = []byte{0x00, 0xa4, 0x00, 0x0c, 0x02, 0x3f, 0x00} // SELECT MF

		fmt.Println("Transmit:")
		fmt.Printf("\tc-apdu: % x\n", cmd)
		rsp, err := card.Transmit(cmd)
		if err != nil {
			die(err)
		}
		fmt.Printf("\tr-apdu: % x\n", rsp)
	}
}
Output:

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Version

func Version() string

Version returns the libpcsclite version string

Types

type Attrib

type Attrib uint32
const (
	AttrVendorName           Attrib = 0x10100
	AttrVendorIfdType        Attrib = 0x10101
	AttrVendorIfdVersion     Attrib = 0x10102
	AttrVendorIfdSerialNo    Attrib = 0x10103
	AttrChannelId            Attrib = 0x20110
	AttrAsyncProtocolTypes   Attrib = 0x30120
	AttrDefaultClk           Attrib = 0x30121
	AttrMaxClk               Attrib = 0x30122
	AttrDefaultDataRate      Attrib = 0x30123
	AttrMaxDataRate          Attrib = 0x30124
	AttrMaxIfsd              Attrib = 0x30125
	AttrSyncProtocolTypes    Attrib = 0x30126
	AttrPowerMgmtSupport     Attrib = 0x40131
	AttrUserToCardAuthDevice Attrib = 0x50140
	AttrUserAuthInputDevice  Attrib = 0x50142
	AttrCharacteristics      Attrib = 0x60150
	AttrCurrentProtocolType  Attrib = 0x80201
	AttrCurrentClk           Attrib = 0x80202
	AttrCurrentF             Attrib = 0x80203
	AttrCurrentD             Attrib = 0x80204
	AttrCurrentN             Attrib = 0x80205
	AttrCurrentW             Attrib = 0x80206
	AttrCurrentIfsc          Attrib = 0x80207
	AttrCurrentIfsd          Attrib = 0x80208
	AttrCurrentBwt           Attrib = 0x80209
	AttrCurrentCwt           Attrib = 0x8020a
	AttrCurrentEbcEncoding   Attrib = 0x8020b
	AttrExtendedBwt          Attrib = 0x8020c
	AttrIccPresence          Attrib = 0x90300
	AttrIccInterfaceStatus   Attrib = 0x90301
	AttrCurrentIoState       Attrib = 0x90302
	AttrAtrString            Attrib = 0x90303
	AttrIccTypePerAtr        Attrib = 0x90304
	AttrEscReset             Attrib = 0x7a000
	AttrEscCancel            Attrib = 0x7a003
	AttrEscAuthrequest       Attrib = 0x7a005
	AttrMaxinput             Attrib = 0x7a007
	AttrDeviceUnit           Attrib = 0x7fff0001
	AttrDeviceInUse          Attrib = 0x7fff0002
	AttrDeviceFriendlyName   Attrib = 0x7fff0003
	AttrDeviceSystemName     Attrib = 0x7fff0004
	AttrSupressT1IfsRequest  Attrib = 0x7fff0007
)

type Card

type Card struct {
	// contains filtered or unexported fields
}

func (*Card) ActiveProtocol

func (card *Card) ActiveProtocol() Protocol

the protocol being used

func (*Card) BeginTransaction

func (card *Card) BeginTransaction() error

wraps SCardBeginTransaction

func (*Card) Control

func (card *Card) Control(ioctl uint32, in []byte) ([]byte, error)

wraps SCardControl

func (*Card) Disconnect

func (card *Card) Disconnect(d Disposition) error

wraps SCardDisconnect

func (*Card) EndTransaction

func (card *Card) EndTransaction(disp Disposition) error

wraps SCardEndTransaction

func (*Card) GetAttrib

func (card *Card) GetAttrib(id Attrib) ([]byte, error)

wraps SCardGetAttrib

func (*Card) Reconnect

func (card *Card) Reconnect(mode ShareMode, proto Protocol, disp Disposition) error

wraps SCardReconnect

func (*Card) SetAttrib

func (card *Card) SetAttrib(id Attrib, data []byte) error

wraps SCardSetAttrib

func (*Card) Status

func (card *Card) Status() (*CardStatus, error)

wraps SCardStatus

func (*Card) Transmit

func (card *Card) Transmit(cmd []byte) ([]byte, error)

wraps SCardTransmit

type CardStatus

type CardStatus struct {
	Reader         string
	State          State
	ActiveProtocol Protocol
	Atr            []byte
}

type Context

type Context struct {
	// contains filtered or unexported fields
}

func EstablishContext

func EstablishContext(scope ...Scope) (*Context, error)

wraps SCardEstablishContext

func (*Context) Cancel

func (ctx *Context) Cancel() error

wraps SCardCancel

func (*Context) Connect

func (ctx *Context) Connect(reader string, mode ShareMode, proto Protocol) (*Card, error)

wraps SCardConnect

func (*Context) GetStatusChange

func (ctx *Context) GetStatusChange(readerStates []ReaderState, timeout time.Duration) error

wraps SCardGetStatusChange

func (*Context) IsValid

func (ctx *Context) IsValid() (bool, error)

wraps SCardIsValidContext

func (*Context) ListReaderGroups

func (ctx *Context) ListReaderGroups() ([]string, error)

wraps SCardListReaderGroups

func (*Context) ListReaders

func (ctx *Context) ListReaders() ([]string, error)

wraps SCardListReaders

func (*Context) Release

func (ctx *Context) Release() error

wraps SCardReleaseContext

type Disposition

type Disposition uint32
const (
	LeaveCard   Disposition = 0x0
	ResetCard   Disposition = 0x1
	UnpowerCard Disposition = 0x2
	EjectCard   Disposition = 0x3
)

type Error

type Error uint32
const (
	ErrSuccess                Error = 0x0
	ErrInternalError          Error = 0x80100001
	ErrCancelled              Error = 0x80100002
	ErrInvalidHandle          Error = 0x80100003
	ErrInvalidParameter       Error = 0x80100004
	ErrInvalidTarget          Error = 0x80100005
	ErrNoMemory               Error = 0x80100006
	ErrWaitedTooLong          Error = 0x80100007
	ErrInsufficientBuffer     Error = 0x80100008
	ErrUnknownReader          Error = 0x80100009
	ErrTimeout                Error = 0x8010000a
	ErrSharingViolation       Error = 0x8010000b
	ErrNoSmartcard            Error = 0x8010000c
	ErrUnknownCard            Error = 0x8010000d
	ErrCantDispose            Error = 0x8010000e
	ErrProtoMismatch          Error = 0x8010000f
	ErrNotReady               Error = 0x80100010
	ErrInvalidValue           Error = 0x80100011
	ErrSystemCancelled        Error = 0x80100012
	ErrCommError              Error = 0x80100013
	ErrUnknownError           Error = 0x80100014
	ErrInvalidAtr             Error = 0x80100015
	ErrNotTransacted          Error = 0x80100016
	ErrReaderUnavailable      Error = 0x80100017
	ErrShutdown               Error = 0x80100018
	ErrPciTooSmall            Error = 0x80100019
	ErrReaderUnsupported      Error = 0x8010001a
	ErrDuplicateReader        Error = 0x8010001b
	ErrCardUnsupported        Error = 0x8010001c
	ErrNoService              Error = 0x8010001d
	ErrServiceStopped         Error = 0x8010001e
	ErrUnexpected             Error = 0x8010001f
	ErrUnsupportedFeature     Error = 0x8010001f
	ErrIccInstallation        Error = 0x80100020
	ErrIccCreateorder         Error = 0x80100021
	ErrFileNotFound           Error = 0x80100024
	ErrNoDir                  Error = 0x80100025
	ErrNoFile                 Error = 0x80100026
	ErrNoAccess               Error = 0x80100027
	ErrWriteTooMany           Error = 0x80100028
	ErrBadSeek                Error = 0x80100029
	ErrInvalidChv             Error = 0x8010002a
	ErrUnknownResMng          Error = 0x8010002b
	ErrNoSuchCertificate      Error = 0x8010002c
	ErrCertificateUnavailable Error = 0x8010002d
	ErrNoReadersAvailable     Error = 0x8010002e
	ErrCommDataLost           Error = 0x8010002f
	ErrNoKeyContainer         Error = 0x80100030
	ErrServerTooBusy          Error = 0x80100031
	ErrUnsupportedCard        Error = 0x80100065
	ErrUnresponsiveCard       Error = 0x80100066
	ErrUnpoweredCard          Error = 0x80100067
	ErrResetCard              Error = 0x80100068
	ErrRemovedCard            Error = 0x80100069
	ErrSecurityViolation      Error = 0x8010006a
	ErrWrongChv               Error = 0x8010006b
	ErrChvBlocked             Error = 0x8010006c
	ErrEof                    Error = 0x8010006d
	ErrCancelledByUser        Error = 0x8010006e
	ErrCardNotAuthenticated   Error = 0x8010006f
)

func (Error) Error

func (e Error) Error() string

type Protocol

type Protocol uint32
const (
	ProtocolUndefined Protocol = 0x0
	ProtocolT0        Protocol = 0x1
	ProtocolT1        Protocol = 0x2
	ProtocolAny       Protocol = ProtocolT0 | ProtocolT1
)

type ReaderState

type ReaderState struct {
	Reader       string
	UserData     interface{}
	CurrentState StateFlag
	EventState   StateFlag
	Atr          []byte
}

type Scope

type Scope uint32
const (
	ScopeUser     Scope = 0x0
	ScopeTerminal Scope = 0x1
	ScopeSystem   Scope = 0x2
)

type ShareMode

type ShareMode uint32
const (
	ShareExclusive ShareMode = 0x1
	ShareShared    ShareMode = 0x2
	ShareDirect    ShareMode = 0x3
)

type State

type State uint32
const (
	Unknown    State = 0x1
	Absent     State = 0x2
	Present    State = 0x4
	Swallowed  State = 0x8
	Powered    State = 0x10
	Negotiable State = 0x20
	Specific   State = 0x40
)

type StateFlag

type StateFlag uint32
const (
	StateUnaware     StateFlag = 0x0
	StateIgnore      StateFlag = 0x1
	StateChanged     StateFlag = 0x2
	StateUnknown     StateFlag = 0x4
	StateUnavailable StateFlag = 0x8
	StateEmpty       StateFlag = 0x10
	StatePresent     StateFlag = 0x20
	StateAtrmatch    StateFlag = 0x40
	StateExclusive   StateFlag = 0x80
	StateInuse       StateFlag = 0x100
	StateMute        StateFlag = 0x200
	StateUnpowered   StateFlag = 0x400
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL