52 lines
2.7 KiB
Markdown
52 lines
2.7 KiB
Markdown
![]() |
# Access-controlled NVRAM implementation
|
||
|
|
||
|
This repository contains various pieces related to the Access-controlled NVRAM
|
||
|
HAL. In a nutshell, the Access-controlled NVRAM HAL allows creation of NVRAM
|
||
|
spaces that can hold arbitrary data blobs of limited size. Access restrictions
|
||
|
can be configured on each NVRAM space to prevent the contents from being
|
||
|
accessed or modified, up to the point of requiring full hardware reset to clear
|
||
|
a locked NVRAM space. This can be used for various security features that
|
||
|
require a trusted storage location for critical data that an attacker can't
|
||
|
tamper with. For details of the NVRAM HAL API, see
|
||
|
[hardware/libhardware/include/hardware/nvram.h](https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/nvram.h).
|
||
|
|
||
|
## [client](/client)
|
||
|
|
||
|
Contains a simple command-line application to interact with the NVRAM HAL
|
||
|
implementation. This is useful for experimentation and use in scripts.
|
||
|
`nvram-client` receives commands and parameters on the command line and
|
||
|
translates them to NVRAM HAL calls. Results are printed on stdout.
|
||
|
|
||
|
## [core](/core)
|
||
|
|
||
|
A reference implementation of the NVRAM functionality. This reference
|
||
|
implementation can be used to create NVRAM HAL implementations that run in a
|
||
|
trusted execution environment. It is also the basis for the testing NVRAM HAL
|
||
|
module, which implements the entire NVRAM HAL API surface in userspace for the
|
||
|
sake of illustration (but obviously doesn't meet the persistence and
|
||
|
tamper-evidence requirements).
|
||
|
|
||
|
Note that the reference implementation leaves persistent storage to be handled
|
||
|
by the embedding code, which needs to provide an implementation of the storage
|
||
|
interface defined in
|
||
|
[system/nvram/core/include/nvram/core/storage.h](core/include/nvram/core/storage.h).
|
||
|
|
||
|
## [hal](/hal)
|
||
|
|
||
|
The [hal](/hal) directory contains glue code that simplifies creation of NVRAM
|
||
|
HAL modules. The code implements the API surface specified by the nvram.h HAL
|
||
|
header and translates calls into the request/response message format defined in
|
||
|
the [messages](/messages) directory. Thus, to create a working NVRAM HAL module,
|
||
|
it is sufficient to provide an implementation that understands `nvram::Request`
|
||
|
and `nvram::Response` objects, the glue code will adapt it to the full NVRAM API
|
||
|
surface.
|
||
|
|
||
|
## [messages](/messages)
|
||
|
|
||
|
Defines an IPC message format that can be used to serialize NVRAM HAL calls and
|
||
|
their parameters in preparation for sending them elsewhere (e.g., a TEE) for
|
||
|
execution. There is a request and a response struct corresponding to each NVRAM
|
||
|
HAL function. The `nvram::Request` and `nvram::Response` wrappers keep track of
|
||
|
the actual request or response type, respectively, as well as the request or
|
||
|
response parameters specific to the type.
|