1*5c4dab75SAndroid Build Coastguard Worker# libese 2*5c4dab75SAndroid Build Coastguard Worker 3*5c4dab75SAndroid Build Coastguard WorkerDocument last updated: 13 Jan 2017 4*5c4dab75SAndroid Build Coastguard Worker 5*5c4dab75SAndroid Build Coastguard Worker## Introduction 6*5c4dab75SAndroid Build Coastguard Worker 7*5c4dab75SAndroid Build Coastguard Workerlibese provides a minimal transport wrapper for communicating with 8*5c4dab75SAndroid Build Coastguard Workerembedded secure elements. Embedded secure elements typically adhere 9*5c4dab75SAndroid Build Coastguard Workerto smart card standards whose translation is not always smooth when 10*5c4dab75SAndroid Build Coastguard Workermigrated to an always connected bus, like SPI. The interfaces 11*5c4dab75SAndroid Build Coastguard Workerexposed by libese should enable higher level "terminal" implementations 12*5c4dab75SAndroid Build Coastguard Workerto be written on top and/or a service which provides a similar 13*5c4dab75SAndroid Build Coastguard Workerinterface. 14*5c4dab75SAndroid Build Coastguard Worker 15*5c4dab75SAndroid Build Coastguard WorkerBehind the interface, libese should help smooth over the differences 16*5c4dab75SAndroid Build Coastguard Workerbetween eSEs and smart cards use in the hardware adapter 17*5c4dab75SAndroid Build Coastguard Workerimplementations. Additionally, a T=1 implementation is supplied, 18*5c4dab75SAndroid Build Coastguard Workeras it appears to be the most common wire transport for these chips. 19*5c4dab75SAndroid Build Coastguard Worker 20*5c4dab75SAndroid Build Coastguard Worker## Usage 21*5c4dab75SAndroid Build Coastguard Worker 22*5c4dab75SAndroid Build Coastguard WorkerPublic client interface for Embedded Secure Elements. 23*5c4dab75SAndroid Build Coastguard Worker 24*5c4dab75SAndroid Build Coastguard WorkerPrior to use in a file, import all necessary variables with: 25*5c4dab75SAndroid Build Coastguard Worker 26*5c4dab75SAndroid Build Coastguard Worker ESE_INCLUDE_HW(SOME_HAL_IMPL); 27*5c4dab75SAndroid Build Coastguard Worker 28*5c4dab75SAndroid Build Coastguard WorkerInstantiate in a function with: 29*5c4dab75SAndroid Build Coastguard Worker 30*5c4dab75SAndroid Build Coastguard Worker ESE_DECLARE(my_ese, SOME_HAL_IMPL); 31*5c4dab75SAndroid Build Coastguard Worker 32*5c4dab75SAndroid Build Coastguard Workeror 33*5c4dab75SAndroid Build Coastguard Worker 34*5c4dab75SAndroid Build Coastguard Worker struct EseInterface my_ese = ESE_INITIALIZER(SOME_HAL_IMPL); 35*5c4dab75SAndroid Build Coastguard Worker 36*5c4dab75SAndroid Build Coastguard Workeror 37*5c4dab75SAndroid Build Coastguard Worker 38*5c4dab75SAndroid Build Coastguard Worker struct EseInterface *my_ese = malloc(sizeof(struct EseInterface)); 39*5c4dab75SAndroid Build Coastguard Worker ... 40*5c4dab75SAndroid Build Coastguard Worker ese_init(my_ese, SOME_HAL_IMPL); 41*5c4dab75SAndroid Build Coastguard Worker 42*5c4dab75SAndroid Build Coastguard WorkerTo initialize the hardware abstraction, call: 43*5c4dab75SAndroid Build Coastguard Worker 44*5c4dab75SAndroid Build Coastguard Worker ese_open(my_ese); 45*5c4dab75SAndroid Build Coastguard Worker 46*5c4dab75SAndroid Build Coastguard WorkerTo release any claimed resources, call 47*5c4dab75SAndroid Build Coastguard Worker 48*5c4dab75SAndroid Build Coastguard Worker ese_close(my_ese) 49*5c4dab75SAndroid Build Coastguard Worker 50*5c4dab75SAndroid Build Coastguard Workerwhen interface use is complete. 51*5c4dab75SAndroid Build Coastguard Worker 52*5c4dab75SAndroid Build Coastguard WorkerTo perform a transmit-receive cycle, call 53*5c4dab75SAndroid Build Coastguard Worker 54*5c4dab75SAndroid Build Coastguard Worker ese_transceive(my_ese, ...); 55*5c4dab75SAndroid Build Coastguard Worker 56*5c4dab75SAndroid Build Coastguard Workerwith a filled transmit buffer with total data length and 57*5c4dab75SAndroid Build Coastguard Workeran empty receive buffer and a maximum fill length. 58*5c4dab75SAndroid Build Coastguard WorkerA negative return value indicates an error and a hardware 59*5c4dab75SAndroid Build Coastguard Workerspecific code and string may be collected with calls to 60*5c4dab75SAndroid Build Coastguard Worker 61*5c4dab75SAndroid Build Coastguard Worker ese_error_code(my_ese); 62*5c4dab75SAndroid Build Coastguard Worker ese_error_message(my_ese); 63*5c4dab75SAndroid Build Coastguard Worker 64*5c4dab75SAndroid Build Coastguard WorkerThe EseInterface is not safe for concurrent access. 65*5c4dab75SAndroid Build Coastguard Worker(Patches welcome! ;). 66*5c4dab75SAndroid Build Coastguard Worker 67*5c4dab75SAndroid Build Coastguard Worker# Components 68*5c4dab75SAndroid Build Coastguard Worker 69*5c4dab75SAndroid Build Coastguard Workerlibese is broken into multiple pieces: 70*5c4dab75SAndroid Build Coastguard Worker * libese 71*5c4dab75SAndroid Build Coastguard Worker * libese-sysdeps 72*5c4dab75SAndroid Build Coastguard Worker * libese-hw 73*5c4dab75SAndroid Build Coastguard Worker * libese-teq1 74*5c4dab75SAndroid Build Coastguard Worker 75*5c4dab75SAndroid Build Coastguard Worker*libese* provides the headers and wrappers for writing libese clients 76*5c4dab75SAndroid Build Coastguard Workerand for implementing hardware backends. It depends on a backend being 77*5c4dab75SAndroid Build Coastguard Workerprovided as per *libese-hw* and on *libese-sysdeps*. 78*5c4dab75SAndroid Build Coastguard Worker 79*5c4dab75SAndroid Build Coastguard Worker*libese-sysdeps* provides the system level libraries that are needed by 80*5c4dab75SAndroid Build Coastguard Workerlibese provided software. If libese is being ported to a new environment, 81*5c4dab75SAndroid Build Coastguard Workerlike a bootloader or non-Linux OS, this library may need to be replaced. 82*5c4dab75SAndroid Build Coastguard Worker(Also take a look at libese/include/ese/log.h for the macro definitions 83*5c4dab75SAndroid Build Coastguard Worker that may be needed.) 84*5c4dab75SAndroid Build Coastguard Worker 85*5c4dab75SAndroid Build Coastguard Worker*libese-hw* provides existing libese hardware backends. 86*5c4dab75SAndroid Build Coastguard Worker 87*5c4dab75SAndroid Build Coastguard Worker*libese-teq1* provides a T=1 compatible transcieve function that may be 88*5c4dab75SAndroid Build Coastguard Workerused by a hardware backend. It comes with some prequisites for use, 89*5c4dab75SAndroid Build Coastguard Workersuch as a specifically structured set of error messages and 90*5c4dab75SAndroid Build Coastguard WorkerEseInteface pad usage, but otherwise it does not depends on any specific 91*5c4dab75SAndroid Build Coastguard Workerfunctionality not abstracted via the libese EseOperations structure. 92*5c4dab75SAndroid Build Coastguard Worker 93*5c4dab75SAndroid Build Coastguard Worker 94*5c4dab75SAndroid Build Coastguard Worker## Supported backends 95*5c4dab75SAndroid Build Coastguard Worker 96*5c4dab75SAndroid Build Coastguard WorkerThere are two test backends, fake and echo, as well as one 97*5c4dab75SAndroid Build Coastguard Workerreal backend for the NXP PN80T/PN81A. 98*5c4dab75SAndroid Build Coastguard Worker 99*5c4dab75SAndroid Build Coastguard WorkerThe NXP backends support both a direct kernel driver and 100*5c4dab75SAndroid Build Coastguard Workera Linux SPIdev interface. 101