commit | 5c2c3b94617a29e9ada91649b5775a24fdc7c886 | [log] [tgz] |
---|---|---|
author | Will Drewry <wad@google.com> | Tue May 09 12:31:10 2017 -0500 |
committer | Will Drewry <wad@google.com> | Wed May 17 12:13:00 2017 -0500 |
tree | 2847994cf11abe5af275743809b1f2a874ebe127 | |
parent | 3eca2f28263f3ea5e5d760949c135a648f2df308 [diff] |
apps/boot: Clean up applet The applet had a few todos and a few gaps: - setWithMetadata was not enforcing requiredLocks. - extended apdu support for incoming data was added - a metadata staging interface added to work around communication constraints on different devices. - setting or unsetting a lock with 0 metadata and useMetadata, will clear the metadata contents. - adds inBootloaderRaw to state output for diagnostics. The libese interface did not change, but the implementation reflects the new behavior. The applet version is updated appropriately. (This change increases the flash footprint by 2k, but attempts to avoid actually writing to it.) Test: submit a 4k key and it writes and reads. all ese-boot-tool functions pass. LOCK_OWNER behavior is enforced even when using metadata. Bug: 38150381 Change-Id: I0759db7388f8f42a7828b699b7b05b6046ec5a53
Document last updated: 13 Jan 2017
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.
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! ;).
libese is broken into multiple pieces:
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.
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.