summaryrefslogtreecommitdiffstats
path: root/chromium/docs/website/site/developers/design-documents/chaps-technical-design/index.md
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/docs/website/site/developers/design-documents/chaps-technical-design/index.md')
-rw-r--r--chromium/docs/website/site/developers/design-documents/chaps-technical-design/index.md537
1 files changed, 0 insertions, 537 deletions
diff --git a/chromium/docs/website/site/developers/design-documents/chaps-technical-design/index.md b/chromium/docs/website/site/developers/design-documents/chaps-technical-design/index.md
deleted file mode 100644
index f95b9bfbcc9..00000000000
--- a/chromium/docs/website/site/developers/design-documents/chaps-technical-design/index.md
+++ /dev/null
@@ -1,537 +0,0 @@
----
-breadcrumbs:
-- - /developers
- - For Developers
-- - /developers/design-documents
- - Design Documents
-page_name: chaps-technical-design
-title: Chaps Technical Design
----
-
-[TOC]
-
-## Objective
-
-Chaps is a PKCS #11 implementation that provides trusted platform module (TPM)
-backed cryptographic services. It replaces openCryptoki as the provider of
-TPM-backed cryptographic services on Chrome OS. It aims to improve speed and
-reliability of cryptographic token operations as well as to provide a simpler
-and more flexible codebase for future enhancements. Chaps works with a TCG
-Software Stack (TSS). On Chrome OS the TrouSerS TSS implementation is used, but
-Chaps is not limited to working with TrouSerS. The name "Chaps" has no real
-significance other than its fitness as a name for a layer above TrouSerS.
-
-The following diagram illustrates where Chaps fits in the cryptographic services
-stack.
-
-[<img alt="image"
-src="/developers/design-documents/chaps-technical-design/ChapsStack.png">](/developers/design-documents/chaps-technical-design/ChapsStack.png)
-
-## Rationale
-
-The motivation for creating Chaps and phasing out openCryptoki is threefold:
-
-* Stability - There have been numerous bugs and quirks that are
- difficult to find and sometimes messy to fix. We want a module that
- is designed to be highly testable and that lends itself to automated
- testing.
-* Performance - TPMs are notoriously slow, and we want to both
- leverage security and optimize performance.
-* Integration - We want a module that integrates well with Chrome OS
- and how Chrome OS uses TPM-backed cryptographic services.
- openCryptoki does not meet this criteria, and some future
- considerations, such as multi-token scenarios, are not possible with
- openCryptoki. We also want code that will be easy to enhance in the
- future.
-
-## Audience
-
-This document is for engineers, system integrators, and security analysts
-interested in the details of Chrome OS security.
-
-## Resources
-
-The following resources provide useful background to this document:
-
-* [TrouSers PKCS #11 Interface
- Docs](http://trousers.sourceforge.net/pkcs11.html): OpenCryptoki is
- currently used with a plugin from the TrouSerS project to provide
- the TPM-specific implementation. This link provides details on the
- plugin and the model it implements.
-* [PKCS #11: Cryptographic Token Interface
- Standard](http://www.rsa.com/rsalabs/node.asp?id=2133)
-* [TCG Software Stack
- Specification](http://www.trustedcomputinggroup.org/files/resource_files/6479CD77-1D09-3519-AD89EAD1BC8C97F0/TSS_1_2_Errata_A-final.pdf)
-
-## Overview
-
-Chaps has two major components:
-
-* chapsd - A daemon that receives and handles PKCS #11 calls via the
- D-Bus. This daemon is always running and starts at boot.
-* libchaps.so - A library that exports the PKCS #11 interface and
- communicates with chapsd. An application loads and uses this library
- like any other PKCS #11 library.
-
-Chaps reports two slots: (1) a system slot (not currently enabled) and (2) a
-user slot. The system slot will always have a token available. The user slot
-will have a token available while a user is logged in. chapsd receives
-login/logout notifications from cryptohome. The login notification must provide
-the user password (or some password-derived value) that will be used as
-authorization data for TPM-protected keys. Cryptohome derives the authorization
-data from the user password and a user-and-system-specific salt value using the
-scrypt key derivation scheme.
-
-This diagram shows the Chaps high-level architecture:
-
-[<img alt="image"
-src="/developers/design-documents/chaps-technical-design/ChapsArchitecture.png">](/developers/design-documents/chaps-technical-design/ChapsArchitecture.png)
-
-### Staging
-
-* Phase 1 (enabled in Chrome OS version 18) - Introduce chapsd:
- * Marshaling of all PKCS #11 calls from libchaps.so to chapsd.
- * chapsd redirection to openCryptoki.
- * Integration of libchaps.so with all PKCS #11 applications.
- * chapsd runs as chronos to play nice with existing openCryptoki
- files and facilitate a rollback in the event of unexpected
- problems.
-* Phase 2 (enabled in Chrome OS version 20) - Replace openCryptoki:
- * chapsd implementation (redirection to openCryptoki is removed).
- * chapsd runs as a system user named "chaps."
- * OpenCryptoki is removed from the system.
-* Phase 3 (optional) - Do more in software:
- * TPM-encrypted key store for faster RSA operations. A
- TPM-protected symmetric key is used to encrypt a key store
- outside of the TPM. This symmetric key will be much faster to
- load than RSA keys and can be temporarily cached. The RSA keys
- are then stored in the key store and the cryptographic
- operations are performed in software.
-
-## Infrastructures
-
-### Inter-Process Communication (IPC)
-
-All IPC with chapsd is performed using D-Bus. Both the Chaps client and daemon
-use dbus-c++ to generate proxy and adaptor classes.
-
-### Persistence
-
-Object data is stored in /var/lib/chaps for the system token and in ~/.chaps for
-each user. The object database is implemented using LevelDB.
-
-### TPM Software Layers
-
-The TrouSers library is used to access TPM services from the TSPI layer.
-
-### Testing
-
-Unit tests for Chaps use the gtest and gmock frameworks. End-to-end tests use
-the autotest framework.
-
-## Detailed Design
-
-### TPM Interaction
-
-#### Phase 1 - Introduce chapsd:
-
-In Phase 1 all TPM interaction is still controlled by openCryptoki. The
-introduction of chapsd does not change TPM interaction in any way.
-
-#### Phase 2 - Replace openCryptoki:
-
-All RSA private keys with the attribute CKA_TOKEN set to TRUE will be bound to
-the TPM (wrapped by the Storage Root Key) and will not be extractable. All other
-private data and non-RSA keys are stored encrypted by the User Encryption Key
-which is protected by the TPM’s SRK but is extractable. This diagram depicts the
-key hierarchy:
-
-[<img alt="image"
-src="/developers/design-documents/chaps-technical-design/KeyHierarchy.png">](/developers/design-documents/chaps-technical-design/KeyHierarchy.png)
-
-##### Authorization Data
-
-Authorization data for the User Authorization Key is derived from the user
-password using the scrypt scheme. Salt is stored in a root-accessible file in
-the user’s home directory and is unique per user account per system. This
-ensures that authorization data for the same user on two different systems is
-different. The scrypt parameters are tuned to perform the computation in about
-100ms.
-
-All other authorization data is randomly generated and stored encrypted with the
-User Encryption Key. This authorization data is not directly encrypted with the
-User Authorization Key for performance reasons. This does not reduce security
-since any attack on the key would require access to the TPM (and so decryption
-of authorization data by the TPM would be possible).
-
-##### Migration
-
-Existing TPM-protected keys cannot be migrated to this hierarchy. The existing
-hierarchy is supported so that existing keys can continue to be used. All other
-data including meta-data associated with TPM-protected keys that was previously
-stored in the openCryptoki object store can be migrated to the new persistent
-object store. This migration will take place when valid openCryptoki object data
-is found in a user’s home directory and migration has not previously taken
-place.
-
-##### Multiple Users
-
-In the future, simultaneous multiple user logins may need to be supported, and
-this design must accommodate this scenario. Each slot maintains a distinct
-object database, a distinct User Authorization Key and User Encryption Key, and
-uses a distinct password. Currently, only the "system" and "user" slots exist,
-but adding a new user would be as simple as adding another slot.
-
-#### Phase 3 - Do more in software:
-
-The key hierarchy for Phase 3 is the same as for Phase 2. The difference is that
-in Phase 3 some RSA keys can be protected by the User Encryption Key rather than
-being directly TPM-protected. Keys that require higher performance and do not
-require the high security of direct TPM binding are candidates for this. There
-is no migration of existing RSA keys because they are not extractable.
-
-### Chaps Classes
-
-Chaps is implemented in C++ and makes wide use of mockable interfaces. This
-structure allows for a high level of unit test coverage. In general, all classes
-inherit from an interface class, and when one class interacts with another, it
-references the interface, not the implementation class.
-
-* ChapsInterface - This interface is the C++ equivalent of the IPC
- contract between the Chaps client and daemon. The actual interface
- used by dbus-c++ is described in XML. ChapsInterface is implemented
- on the client side by ChapsProxyImpl and on the daemon side by
- ChapsServiceRedirect (Phase 1) and ChapsServiceImpl (Phase 2). The
- following diagram shows the class hierarchy and how the classes
- interact in practice.
-
-[<img alt="image"
-src="/developers/design-documents/chaps-technical-design/ClassHierarchy.png">](/developers/design-documents/chaps-technical-design/ClassHierarchy.png)
-
-* ChapsProxyImpl - This class implements ChapsInterface and forwards
- all calls to an instance of the dbus-c++ generated proxy class.
-* ChapsAdaptor - This class implements the dbus-c++ generated adaptor
- interface and forwards all dbus calls to a ChapsInterface instance.
-* ChapsServiceRedirect - This class implements ChapsInterface and
- forwards all calls to a PKCS #11 library. In Phase 1 this class is
- hooked up to ChapsAdaptor and forwards incoming calls to
- openCryptoki. In Phase 2 this class will no longer be used.
-* ChapsServiceImpl - This class implements ChapsInterface and provides
- the actual Chaps implementation (in contrast to
- ChapsServiceRedirect). This class is hooked up to ChapsAdaptor (in
- Phase 2) and serves as the entry point of all calls to chapsd.
-* ChapsFactory - This class creates default instances of interface
- classes. In a test environment, a mock of this class can be
- configured to create the desired combination of real and mock
- objects.
-* SlotManager / SlotManagerImpl - This mockable class manages the
- state of all slots, the tokens in them, and maintains a list of
- sessions for each token.
-* Session / SessionImpl - This mockable class represents a session and
- manages all contextual information for a single session.
-* ObjectPolicy - An instance of this class is bound to each object; it
- enforces all policies specified in PKCS #11 for the particular
- object type. There is a subclass of this interface for each object
- type.
-* Object / ObjectImpl - This mockable class represents an object and
- is optionally persistent.
-* ObjectPool / ObjectPoolImpl - This mockable class represents an
- unordered group of objects. An ObjectPool may or may not be backed
- by an ObjectStore.
-* ObjectStore / ObjectStoreImpl - This mockable class implements a
- persistent object store. This is the only class that references the
- LevelDB API.
-* TPMUtility / TPMUtilityImpl - This mockable class interfaces with
- the TrouSerS library for interaction with the TPM.
-* ObjectImporter / OpencryptokiImporter - This mockable class imports
- objects from an external source. The openCryptoki-specific
- implementation imports objects from an openCryptoki database.
-
-### **Marshalling**
-
-All marshalling is performed by dbus-c++ with the exception of template
-arguments (that is, CK_ATTRIBUTE lists), which are serialized using the protobuf
-library.
-
-### Schema
-
-LevelDB is not relational, so a relational schema is not used. Objects are
-serialized and assigned a unique identifier. The keys in LevelDB are the object
-identifiers, and the values are serialized object blobs.
-
-### Deployment
-
-#### Phase 1
-
-Phase 1 deployment has the following goals:
-
-* The PKCS #11 system is fully functional following each individual
- CL. This is necessary because multiple repositories are involved
- (for example, chaps, cryptohome, chrome, init, …).
-* A full rollback is possible at any time.
-
-The following ordered deployment plan meets these goals:
-
-1. Both chapsd and libchaps.so are installed and fully functional.
- chapsd runs as chronos:pkcs11 in order to play nice with other
- applications loading openCryptoki directly.
-2. An upstart configuration file is added for chapsd so it starts
- before login and respawns automatically. It depends on tcsd and
- dbus.
-3. Chaps is added as a run-time dependency to the cryptohome ebuild.
-4. The cryptohome upstart configuration is modified to depend on
- chapsd.
-5. Cryptohome is modified to link against Chaps rather than
- openCryptoki.
-6. All other modules that use openCryptoki are modified (in any order)
- to use Chaps. This includes but is not limited to:
- 1. NSS in Chrome
- 2. vpn_manager
- 3. flimflam
- 4. wpa_supplicant
- 5. entd
-
-#### Phase 2
-
-Phase 2 deployment has the following goals:
-
-* The PKCS #11 system is fully functional at all times.
-* Migration is seamless to all users.
-* A partial rollback is possible for a limited time that will put a
- migrated user token back in the state it was in before migration.
- Modifications since migration will be lost; this works like
- restoring a backup.
-
-The following deployment plan meets these goals:
-
-1. When a token is migrated, all existing files are left intact and a
- database record is created to indicate that migration has taken
- place. Upon rollback, openCryptoki simply keeps working with these
- files as it did before migration.
-2. The switch is in the chapsd upstart configuration: the target
- library argument is removed to enable Phase 2 logic and is re-added
- in order to roll back.
-3. Finally, once confidence is established in the Phase 2 logic,
- cleanup tasks can be performed that preclude future rollbacks. These
- include:
- 1. Remove all openCryptoki-related files in the user token
- directory.
- 2. Remove all openCryptoki-related logic from cryptohome code.
- 3. Remove openCryptoki from the build.
-
-## Project Information
-
-The Chaps code resides in a Chromium OS git repository at
-<http://git.chromium.org/gitweb/?p=chromiumos/platform/chaps.git;a=summary>.
-
-## Internationalization and Localization
-
-The Chaps library returns the following strings which may need to be translated.
-It is assumed that manufacturer ID strings do not require translation. If a
-string does not appear in the Chrome OS user interface, it may not require
-translation.
-
-* C_GetInfo returns a library description.
-* C_GetSlotInfo returns a slot description.
-* C_GetTokenInfo returns a token label, token model, and token
- description.
-
-## Security Considerations
-
-The following table lists some threats that are mitigated by the Chaps system
-and provides details on how the threat is mitigated.
-
-<table>
-<tr>
-<td>Threat</td>
-<td>Mitigation</td>
-</tr>
-<tr>
-<td>Attacker gains access to a user’s cryptographic token services (for example, creates an unauthorized digital signature).</td>
-<td>chapsd only allows connections from authorized uids (chronos, root) using D-Bus policies.</td>
-</tr>
-<tr>
-<td>Attacker owns D-Bus identifier and spoofs cryptographic services.</td>
-<td>D-Bus policy only allows the "chaps" user to own the chapsd identifier.</td>
-</tr>
-<tr>
-<td>Attacker gains access to private data and keys by accessing run-time memory of the chapsd process.</td>
-<td>chapsd runs as the "chaps" user.</td>
-</tr>
-<tr>
-<td>Attacker gains access to private data and keys by accessing persistent data stored by chapsd.</td>
-<td>All private data and keys stored on disk are encrypted with the User Encryption Key and stored in the cryptohome partition.</td>
-</tr>
-<tr>
-<td>Attacker gains access to a user’s TPM-protected resources.</td>
-<td>TPM-protected resources are authorized by a secret derived from the user’s password and a root-accessible random salt value.</td>
-</tr>
-<tr>
-<td>Attacker stages Chaps persistent data in order to leverage a vulnerability in chapsd to gain control of chapsd.</td>
-<td>Chaps persistent data is modifiable only by the "chaps" user (<b>The data needs to be stored in a root-owned directory for this policy to be effective. See <a href="https://crbug.com/212630">crbug.com/212630</a>).</b> </td>
-</tr>
-</table>
-
-If a user is logged in and an attacker gains chapsd privilege, then nothing
-prevents this attacker from reading all private data and keys that are not
-TPM-protected and non-extractable or from creating digital signatures using
-TPM-protected, non-extractable keys. The following are TPM-protected:
-
-* RSA private keys (with modulus 2048 bits or less) that have
- CKA_TOKEN=TRUE.
-
-All objects with CKA_PRIVATE=TRUE are encrypted on disk with a TPM-protected
-key, even if they are not themselves TPM-protected. The following are not
-themselves TPM-protected (other than the on-disk encryption):
-
-* RSA private keys with modulus larger than 2048 bits.
-* RSA private keys with CKA_TOKEN=FALSE.
-* All objects that are not RSA private keys (for example, AES keys,
- data objects).
-
-### Key Storage Example
-
-Suppose you have a certificate with an associated private key used to negotiate
-802.1x and/or VPN connections. The following PKCS #11 objects would exist in the
-Chaps database:
-
-* Certificate: This object is public and is not encrypted.
-* Public Key: This object is public and is not encrypted.
-* Private Key: This object is private and is encrypted with the User
- Encryption Key. It holds the following attributes:
- * Authorization Data: This is random and specific to this key.
- * Private Key Blob: This is a TPM-wrapped blob.
-* Encrypted User Encryption Key: This is encrypted by the User
- Authorization Key.
-* User Authorization Key Blob: This is a TPM-wrapped blob.
-
-The following information would be in chapsd process memory while the token is
-loaded:
-
-* User Encryption Key: This has been decrypted using the User
- Authorization Key and the password-derived secret as authorization
- data.
-* The Certificate, Public Key, and Private Key, as listed above. The
- Private Key has been decrypted using the User Encryption Key.
-
-### Cryptography
-
-This section lists each way in which Chaps uses cryptography and gives details
-as to how it is used. In all cases where cryptography is used in software, Chaps
-uses the openssl crypto library to provide the underlying algorithm
-implementations.
-
-#### Random Numbers
-
-The openssl cryptographically strong pseudo-random-number-generator (PRNG) is
-used as a source of random numbers. It is seeded using the default openssl
-seeding mechanism (/dev/urandom on Chrome OS) in combination with 128 random
-bytes from the TPM. This seeding occurs only once per chapsd process.
-
-#### PKCS #11 Software Mechanisms
-
-Chaps supports a number of mechanisms in software that are not supported by the
-TPM (for example, SHA, HMAC, AES). The implementation of these mechanisms pass
-through directly to openssl, including padding and cipher modes, with the
-following exceptions:
-
-* The construction of RSA signing data. Chaps constructs the signing
- data itself and then employs the openssl RSA primitive. This
- approach guarantees signature compatibility between openssl and a
- TPM.
-* The generation of DES / DES3 keys. Chaps is still using openssl
- functions such as DES_is_weak_key() and the openssl PRNG.
-
-#### Encryption / Authentication of Persistent Objects
-
-Private object blobs are encrypted using AES-256-CBC with PKCS padding. An
-initialization vector (IV) is randomly generated for each encryption operation;
-it is appended to the encrypted blob. An HMAC-SHA512 mac is appended to each
-encrypted blob. This mac is verified before the decryption is attempted.
-Verification uses a version of memcmp that reads and compares all bytes
-regardless of where a mismatch is found.
-
-#### Authorization Data Hashes
-
-Once authorization data is derived from the user password or similar using
-scrypt, it is processed as follows:
-
-* An SHA-1 hash of the authorization data is computed and sent to the
- TPM. This hash is never stored on disk and is considered as
- sensitive as the user password.
-* An SHA-512 hash of the authorization data is computed and the first
- byte of the hash is stored in the token database. This allows Chaps
- to sanity-check incoming authorization data before sending it to the
- TPM. Only a single byte is stored because it allows a reasonable
- sanity check but it is not very useful for a brute-force attack
- against the authorization data or the user password.
-
-## Logging Plan
-
-All errors are logged using the facility provided by base/logging.h.
-
-## Testing Plan
-
-Chaps is tested using both unit and integration tests. All unit tests are run
-from the ebuild test phase. The integration tests can be run manually or with
-the autotest framework.
-
-### Unit / Integration Tests
-
-The classes generated by dbus-c++ are not suitable for stubbing / mocking for
-two reasons:
-
-* We don’t want dbus code running in the unit test environment.
- Problems with this approach have been noted on other projects.
-* The classes are tightly coupled with types and conventions that are
- specific to dbus-c++.
-
-A C++ interface is defined (ChapsInterface) that is very close to the generated
-proxy and adaptor interfaces but suitable for using and mocking in a test
-environment.
-
-#### Client-side Unit Tests
-
-The client-side code is unit tested by using a mock proxy and calling the PKCS
-#11 C interface. Because the code being tested is called by external code, all
-argument validation and internal state validation is tested thoroughly resulting
-in a high level of code coverage.
-
-#### Daemon-side Unit / Integration Tests
-
-Phase 1: There are no unit tests per se for the chapsd code in Phase 1 because
-each layer is either tightly coupled with D-Bus or tightly coupled with
-openCryptoki. The chapsd code is tested by a suite that verifies basic
-functionality of ChapsInterface methods. This test suite is then run on both a
-ChapsServiceRedirect instance and on a ChapsProxyImpl instance. These tests
-require a configured openCryptoki and, in the ChapsProxyImpl case, a running
-chapsd instance. Because of this requirement, the tests must be run on a live
-system, and they do not run as part of the ebuild test phase.
-
-Phase 2: The tests from Phase 1 are reused and are run on a ChapsServiceImpl
-instance and a ChapsProxyImpl instance. In the case of ChapsServiceImpl, a mock
-persistence object can be used, and the suite can run as a unit test. In the
-case of ChapsProxyImpl, the suite is run as an integration test and requires a
-running chapsd instance as in Phase 1. In addition to this, unit tests which are
-specific to a single class are run for the following classes:
-
-* SlotManager
-* Session
-* ObjectPolicy
-* Object
-* ObjectPool
-* ObjectStore
-* TPMUtility
-
-For each of these unit tests, any references to other objects are mocks. The
-following mocks are available:
-
-* ChapsFactoryMock
-* SlotManagerMock
-* SessionMock
-* ObjectPolicyMock
-* ObjectMock
-* ObjectPoolMock
-* ObjectStoreMock
-* ObjectImporterMock
-* TPMUtilityMock \ No newline at end of file