# rust-ccatoken
`rust-ccatoken` is an implementation of the Arm CCA attestation token (§A.7 of the [Realm Management Monitor (RMM) Specification](https://developer.arm.com/documentation/den0137/latest)) in Rust.
The library implements interfaces to:
* Decode a CBOR-encoded CCA token
* Verify the CCA token (Platform, Realm and their binding)
* Appraise CCA evidence using user-supplied reference values and endorsements
## `ccatoken` CLI
Alongside the library code, this crate provides a CLI to manipulate CCA tokens.
All the examples below assume all paths are relative to the root of this repository, and that the `ccatoken` executable is reachable via the shell `PATH`. I.e.:
```sh
export PATH=$PATH:"$PWD/target/debug"
```
### `ccatoken golden`
The `golden` command creates reference values and trust anchor for the given token and CPAK.
If the token is not successfully verified with CPAK no values are extracted.
```sh
ccatoken golden \
-e testdata/cca-token.cbor \
-c testdata/cpak.json \
-t golden-tastore.json \
-r golden-rvstore.json
```
On success:
```
golden values extraction successful
```
the two "golden" stores are saved on disk. The contents can be pretty-printed using `jq(1)` as follows:
```sh
jq . golden-*.json
```
which should produce an output similar to the following:
```json
{
"platform": [
{
"implementation-id": "7f454c4602010100000000000000000003003e00010000005058000000000000",
"sw-components": [
{
"measurement-value": "07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a1918",
"signer-id": "07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a1918",
"version": "3.4.2",
"component-type": "BL"
},
{
"measurement-value": "07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a1918",
"signer-id": "07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a1918",
"version": "1.2",
"component-type": "M1"
},
{
"measurement-value": "07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a1918",
"signer-id": "07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a1918",
"version": "1.2.3",
"component-type": "M2"
},
{
"measurement-value": "07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a1918",
"signer-id": "07060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a1918",
"version": "1",
"component-type": "M3"
}
],
"platform-configuration": "0107060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a1918"
}
],
"realm": [
{
"initial-measurement": "0000000000000000000000000000000000000000000000000000000000000000",
"rak-hash-algorithm": "sha-256",
"extensible-measurements": [
"0000000000000000000000000000000000000000000000000000000000000000",
"0000000000000000000000000000000000000000000000000000000000000000",
"0000000000000000000000000000000000000000000000000000000000000000",
"0000000000000000000000000000000000000000000000000000000000000000"
],
"personalization-value": "54686520717569636b2062726f776e20666f78206a756d7073206f766572203133206c617a7920646f67732e54686520717569636b2062726f776e20666f7820"
}
]
}
[
{
"pkey": {
"crv": "P-384",
"kty": "EC",
"x": "IShnxS4rlQiwpCCpBWDzlNLfqiG911FP8akBr-fh94uxHU5m-Kijivp2r2oxxN6M",
"y": "hM4tr8mWQli1P61xh3T0ViDREbF26DGOEYfbAjWjGNN7pZf-6A4OTHYqEryz6m7U"
},
"implementation-id": "7f454c4602010100000000000000000003003e00010000005058000000000000",
"instance-id": "0107060504030201000f0e0d0c0b0a090817161514131211101f1e1d1c1b1a1918"
}
]
```
### `ccatoken appraise`
The `appraise` command tries to match the supplied CCA token and reference values.
```sh
ccatoken appraise \
-e testdata/cca-token.cbor \
-r golden-rvstore.json
```
On successful completion, the computed trust vectors for the platform and realm are printed to stdout:
```
appraisal completed
platform trust vector: {
"instance-identity": 2,
"configuration": 2,
"executables": 3,
"hardware": 2,
"runtime-opaque": 32
}
realm trust vector: {
"executables": 2
}
```
### `ccatoken verify`
The `verify` command cryptographically verifies the supplied CCA token using a matching CPAK from the trust anchor store.
```sh
ccatoken verify \
-e testdata/cca-token.cbor \
-t golden-tastore.json
```
On successful completion, the computed trust vectors for the platform and realm are printed to stdout:
```
verification completed
platform trust vector: {
"instance-identity": 2
}
realm trust vector: {
"instance-identity": 2
}
```