普通文本  |  101行  |  2.92 KB

# libese

Document last updated: 13 Jan 2017

## Introduction

libese provides a minimal transport wrapper for communicating with
embedded secure elements. Embedded secure elements typically adhere
to smart card standards whose translation is not always smooth when
migrated to an always connected bus, like SPI.  The interfaces
exposed by libese should enable higher level "terminal" implementations
to be written on top and/or a service which provides a similar
interface.

Behind the interface, libese should help smooth over the differences
between eSEs and smart cards use in the hardware adapter
implementations. Additionally, a T=1 implementation is supplied,
as it appears to be the most common wire transport for these chips.

## Usage

Public client interface for Embedded Secure Elements.

Prior to use in a file, import all necessary variables with:

    ESE_INCLUDE_HW(SOME_HAL_IMPL);

Instantiate in a function with:

    ESE_DECLARE(my_ese, SOME_HAL_IMPL);

or

    struct EseInterface my_ese = ESE_INITIALIZER(SOME_HAL_IMPL);

or

    struct EseInterface *my_ese = malloc(sizeof(struct EseInterface));
    ...
    ese_init(my_ese, SOME_HAL_IMPL);

To initialize the hardware abstraction, call:

    ese_open(my_ese);

To release any claimed resources, call

    ese_close(my_ese)

when interface use is complete.

To perform a transmit-receive cycle, call

    ese_transceive(my_ese, ...);

with a filled transmit buffer with total data length and
an empty receive buffer and a maximum fill length.
A negative return value indicates an error and a hardware
specific code and string may be collected with calls to

    ese_error_code(my_ese);
    ese_error_message(my_ese);

The EseInterface is not safe for concurrent access.
(Patches welcome! ;).

# Components

libese is broken into multiple pieces:
  * libese
  * libese-sysdeps
  * libese-hw
  * libese-teq1

*libese* provides the headers and wrappers for writing libese clients
and for implementing hardware backends.  It depends on a backend being
provided as per *libese-hw* and on *libese-sysdeps*.

*libese-sysdeps* provides the system level libraries that are needed by
libese provided software.  If libese is being ported to a new environment,
like a bootloader or non-Linux OS, this library may need to be replaced.
(Also take a look at libese/include/ese/log.h for the macro definitions
 that may be needed.)

*libese-hw* provides existing libese hardware backends.

*libese-teq1* provides a T=1 compatible transcieve function that may be
used by a hardware backend.  It comes with some prequisites for use,
such as a specifically structured set of error messages and
EseInteface pad usage, but otherwise it does not depends on any specific
functionality not abstracted via the libese EseOperations structure.


## Supported backends

There are two test backends, fake and echo, as well as one
real backend for the NXP PN80T/PN81A.

The NXP backends support both a direct kernel driver and
a Linux SPIdev interface.