scard: github.com/ebfe/scard Index | Examples | Files

package scard

import "github.com/ebfe/scard"

Package scard provides bindings to the PC/SC API.

Code:

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)
    }
}

Index

Examples

Package Files

scard.go scard_unix.go zconst.go

func Version Uses

func Version() string

Version returns the libpcsclite version string

type Attrib Uses

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 Uses

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

func (*Card) ActiveProtocol Uses

func (card *Card) ActiveProtocol() Protocol

the protocol being used

func (*Card) BeginTransaction Uses

func (card *Card) BeginTransaction() error

wraps SCardBeginTransaction

func (*Card) Control Uses

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

wraps SCardControl

func (*Card) Disconnect Uses

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

wraps SCardDisconnect

func (*Card) EndTransaction Uses

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

wraps SCardEndTransaction

func (*Card) GetAttrib Uses

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

wraps SCardGetAttrib

func (*Card) Reconnect Uses

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

wraps SCardReconnect

func (*Card) SetAttrib Uses

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

wraps SCardSetAttrib

func (*Card) Status Uses

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

wraps SCardStatus

func (*Card) Transmit Uses

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

wraps SCardTransmit

type CardStatus Uses

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

type Context Uses

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

func EstablishContext Uses

func EstablishContext() (*Context, error)

wraps SCardEstablishContext

func (*Context) Cancel Uses

func (ctx *Context) Cancel() error

wraps SCardCancel

func (*Context) Connect Uses

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

wraps SCardConnect

func (*Context) GetStatusChange Uses

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

wraps SCardGetStatusChange

func (*Context) IsValid Uses

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

wraps SCardIsValidContext

func (*Context) ListReaderGroups Uses

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

wraps SCardListReaderGroups

func (*Context) ListReaders Uses

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

wraps SCardListReaders

func (*Context) Release Uses

func (ctx *Context) Release() error

wraps SCardReleaseContext

type Disposition Uses

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

type Error Uses

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 Uses

func (e Error) Error() string

type Protocol Uses

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

type ReaderState Uses

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

type Scope Uses

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

type ShareMode Uses

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

type State Uses

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 Uses

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
)

Package scard imports 3 packages (graph) and is imported by 12 packages. Updated 2019-11-28. Refresh now. Tools for package owners.