Add meta-parsec layer into meta-security.

The layer contains recipes for Parsec service version 0.7.0 and parsec-tool version 0.3.0. The Parsec service is built with all supported providers and deployed with the MbedCrypto provider enabled. Both systemd and sysv-init are supported.

Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
This commit is contained in:
Anton Antonov
2021-04-09 12:14:07 +01:00
committed by Armin Kuster
parent 6ad6bb0141
commit 409a8d4276
10 changed files with 661 additions and 0 deletions

186
meta-parsec/README.md Normal file
View File

@@ -0,0 +1,186 @@
meta-parsec layer
==============
This layer contains recipes for the Parsec service with Mbed-Crypto,
Pkcs11 and TPM providers and parsec tools.
Dependencies
============
This layer depends on:
URI: git://git.openembedded.org/meta-openembedded
branch: master
revision: HEAD
prio: default
URI git://git.yoctoproject.org/meta-security
branch: master
revision: HEAD
prio: default
URI https://github.com/meta-rust/meta-rust.git
branch: master
revision: HEAD
prio: default
URI https://github.com/kraj/meta-clang.git
branch: master
revision: HEAD
prio: default
Adding the meta-parsec layer to your build
==========================================
In order to use this layer, you need to make the build system aware of it.
You can add it to the build system by adding the
location of the meta-parsec layer to bblayers.conf, along with any
other layers needed. e.g.:
BBLAYERS ?= " \
/path/to/yocto/meta \
/path/to/yocto/meta-yocto \
/path/to/yocto/meta-yocto-bsp \
/path/to/meta-openembedded/meta-oe \
/path/to/meta-openembedded/meta-python \
/path/to/meta-rust \
/path/to/meta-clang \
/path/to/meta-security/meta-tpm \
/path/to/meta-security/meta-parsec \
"
To include the Parsec service into your image add following into the
local.conf:
IMAGE_INSTALL_append = " parsec-service"
The Parsec service will be deployed into the image built with all the supported
providers and with the default config file from the Parsec repository:
https://github.com/parallaxsecond/parsec/blob/main/config.toml
The default Parsec service config file contains the MbedCrypto provider
enabled. The config file needs to be updated to use the Parsec service
with other providers like TPM or PKCS11. The required procedures are
covered in Parsec documentation.
https://parallaxsecond.github.io/parsec-book/
Updating recipes
================
The parsec-service and parsec-tool recipes use include files with lists
of all rust crates required. This allows bitbake to fetch all the necessary
dependent crates, as well as a pegged version of the crates.io index,
to ensure maximum reproducibility.
It's recommended to use cargo-bitbake to generate include files for new
versions of parsec recipes.
https://github.com/meta-rust/cargo-bitbake
When you have crago-bitbake built:
1. Checkout the required version of parsec repository.
2. Run cargo-bitbake inside the repository. It will produce a BB file.
3. Create a new include file with SRC_URI and LIC_FILES_CHKSUM from the BB file.
Manual testing with runqemu
===========================
This layer also contains a recipe for pasec-tool which can be used for
manual testing of the Parsec service:
IMAGE_INSTALL_append += " parsec-tools"
There are a series of Parsec Demo videos showing how to use parsec-tool
to test the Parsec service base functionality:
https://www.youtube.com/watch?v=ido0CyUdMHM&list=PLKjl7IFAwc4S7WQqqphCsyy6DPDxJ2Skg&index=4
You can use runqemu to start a VM with a built image file and run
manual tests with parsec-tool.
1. MbedCrypto provider
The default Parsec service config file contains the MbedCrypto provider
enabled. No changes required for manual testing.
2. PKCS11 provider
The Software HSM can be used for manual testing of the provider by
including it into your test image:
IMAGE_INSTALL_append += " softhsm"
Inside the running VM:
- Stop Parsec
```bash
systemctl stop parsec
```
- Initialise a token and notice the result slot number
```bash
softhsm2-util --init-token --slot 0 --label "Parsec Service" --pin 123456 --so-pin 123456
```
- Change the token ownership:
```bash
for d in /var/lib/softhsm/tokens/*; do chown -R parsec $d; done
```
- Enable the PKCS11 provider and update its parameters in the Parsec config file
/etc/parsec/config.toml
```
library_path = "/usr/lib/softhsm/libsofthsm2.so"
slot_number = <slot number>
user_pin = "123456"
```
- Start Parsec
```bash
systemctl start parsec
```
3. TPM provider
The IBM Software TPM service can be used for manual testing of the provider by
including it into your test image:
IMAGE_INSTALL_append += " ibmswtpm2 tpm2-tools libtss2 libtss2-tcti-mssim"
Inside the running VM:
- Stop Parsec
```bash
systemctl stop parsec
```
- Start and configure the Software TPM server
```bash
/usr/bin/tpm_server &
sleep 5
/usr/bin/tpm2_startup -c -T mssim
/usr/bin/tpm2_changeauth -c owner tpm_pass
```
- Enable the TPM provider and update its parameters in the Parsec config file
/etc/parsec/config.toml
```
tcti = "mssim"
owner_hierarchy_auth = "hex:74706d5f70617373"
```
- Start Parsec
```bash
systemctl start parsec
```
Maintenance
-----------
Send pull requests, patches, comments or questions to yocto@yoctoproject.org
When sending single patches, please using something like:
'git send-email -1 --to yocto@yoctoproject.org --subject-prefix=meta-parsec][PATCH'
These values can be set as defaults for this repository:
$ git config sendemail.to yocto@yoctoproject.org
$ git config format.subjectPrefix meta-parsec][PATCH
Now you can just do 'git send-email origin/master' to send all local patches.
Maintainers: Anton Antonov <Anton.Antonov@arm.com>
Armin Kuster <akuster808@gmail.com>
License
=======
All metadata is MIT licensed unless otherwise stated. Source code included
in tree for individual recipes is under the LICENSE stated in each recipe
(.bb file) unless otherwise stated.

View File

@@ -0,0 +1,14 @@
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have a recipes directory, add to BBFILES
BBFILES += "${LAYERDIR}/recipes*/*/*.bb ${LAYERDIR}/recipes*/*/*.bbappend"
BBFILE_COLLECTIONS += "parsec-layer"
BBFILE_PATTERN_parsec-layer = "^${LAYERDIR}/"
BBFILE_PRIORITY_parsec-layer = "5"
LAYERSERIES_COMPAT_parsec-layer = "hardknott gatesgarth"
LAYERDEPENDS_parsec-layer = "core rust-layer clang-layer tpm-layer"
BBLAYERS_LAYERINDEX_NAME_parsec-layer = "meta-parsec"

View File

@@ -0,0 +1,18 @@
Use cryptoki v0.1.1 which supports the "generate-bindings" feature
required for building Parsec service 0.7.0 in Yocto.
Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
Upstream-Status: Submitted
--- a/Cargo.toml 2021-04-01 10:29:50.333687763 +0100
+++ b/Cargo.toml 2021-04-01 10:27:13.051860002 +0100
@@ -37,7 +37,7 @@
version = "1.3.1"
[dependencies.cryptoki]
-version = "0.1.0"
+version = "0.1.1"
features = ["psa-crypto-conversions"]
optional = true

View File

@@ -0,0 +1,2 @@
#Type Path Mode User Group Age Argument
d /run/parsec 755 parsec parsec - -

View File

@@ -0,0 +1,63 @@
#! /bin/sh -e
# ------------------------------------------------------------------------------
# Copyright (c) 2021, Arm Limited, All Rights Reserved
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ------------------------------------------------------------------------------
# Parsec Service SysV init script
test -x /usr/libexec/parsec/parsec || exit 0
case "$1" in
start)
echo -n "Starting Parsec daemon: "
if [ ! -f /etc/parsec/config.toml ]; then
echo "There is no Parsec service configuration file."
else
if [ ! -d /run/parsec ]; then
mkdir /run/parsec
chown parsec:parsec /run/parsec
chmod 755 /run/parsec
fi
# start-stop-daemon used in poky busybox doesn't support
# '--chdir' parameter. So, let's do it manually
cd /var/lib/parsec
RUST_LOG=info start-stop-daemon --oknodo --start --background \
--chuid parsec:parsec --exec /usr/libexec/parsec/parsec \
-- --config /etc/parsec/config.toml
echo "parsec."
fi
;;
stop)
echo -n "Stopping Parsec daemon: "
start-stop-daemon --oknodo --stop --exec /usr/libexec/parsec/parsec
echo "parsec."
;;
reload)
echo -n "Reloading Parsec daemon: "
start-stop-daemon --stop --signal SIGHUP --exec /usr/libexec/parsec/parsec
echo "parsec."
;;
restart|force-reload)
$0 stop
$0 start
;;
*)
echo "Usage: /etc/init.d/parsec {start|stop|restart|reload|force-reload}"
exit 1
esac
exit 0

View File

@@ -0,0 +1,19 @@
Run the Parsec service as parsec user in /var/lib/parsec/ working directory.
Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
Upstream-Status: Inappropriate [deployment configuration]
--- a/systemd-daemon/parsec.service 2021-03-28 18:34:18.703196235 +0100
+++ b/systemd-daemon/parsec.service 2021-03-28 18:35:14.279830299 +0100
@@ -3,7 +3,9 @@
Documentation=https://parallaxsecond.github.io/parsec-book/parsec_service/install_parsec_linux.html
[Service]
-WorkingDirectory=/home/parsec/
+User=parsec
+Group=parsec
+WorkingDirectory=/var/lib/parsec/
ExecStart=/usr/libexec/parsec/parsec --config /etc/parsec/config.toml
[Install]

View File

@@ -0,0 +1,67 @@
SUMMARY = "Platform AbstRaction for SECurity Daemon"
HOMEPAGE = "https://github.com/parallaxsecond/parsec"
LICENSE = "Apache-2.0"
inherit cargo
SRC_URI += "crate://crates.io/parsec-service/${PV} \
file://parsec_init \
file://systemd.patch \
file://parsec-tmpfiles.conf \
"
DEPENDS = "clang-native tpm2-tss"
INSANE_SKIP_${PN} += "dev-deps"
CARGO_BUILD_FLAGS += " --features all-providers,cryptoki/generate-bindings,tss-esapi/generate-bindings"
inherit systemd
SYSTEMD_SERVICE_${PN} = "parsec.service"
inherit update-rc.d
INITSCRIPT_NAME = "parsec"
# A local file can be defined in build/local.conf
# The file should also be included into SRC_URI then
PARSEC_CONFIG ?= "${S}/config.toml"
do_install_append () {
# Binaries
install -d -m 700 -o parsec -g parsec "${D}${libexecdir}/parsec"
install -m 700 -o parsec -g parsec "${WORKDIR}/build/target/${CARGO_TARGET_SUBDIR}/parsec" ${D}${libexecdir}/parsec/parsec
# Config file
install -d -m 700 -o parsec -g parsec "${D}${sysconfdir}/parsec"
install -m 400 -o parsec -g parsec "${PARSEC_CONFIG}" ${D}${sysconfdir}/parsec/config.toml
# Data dir
install -d -m 700 -o parsec -g parsec "${D}${localstatedir}/lib/parsec"
if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
install -d ${D}${systemd_unitdir}/system
install -m 644 ${S}/systemd-daemon/parsec.service ${D}${systemd_unitdir}/system
install -d ${D}${libdir}/tmpfiles.d
install -m 644 ${WORKDIR}/parsec-tmpfiles.conf ${D}${libdir}/tmpfiles.d
fi
if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then
install -d ${D}${sysconfdir}/init.d
install -m 755 ${WORKDIR}/parsec_init ${D}${sysconfdir}/init.d/parsec
fi
}
inherit useradd
USERADD_PACKAGES = "${PN}"
USERADD_PARAM_${PN} = "-r -g parsec -s /bin/false -d ${localstatedir}/lib/parsec parsec"
GROUPADD_PARAM_${PN} = "-r parsec"
FILES_${PN} += " \
${sysconfdir}/parsec/config.toml \
${libexecdir}/parsec/parsec \
${systemd_unitdir}/system/parsec.service \
${libdir}/tmpfiles.d/parsec-tmpfiles.conf \
${sysconfdir}/init.d/parsec \
"
require parsec-service_${PV}.inc

View File

@@ -0,0 +1,147 @@
# This file is created from parsec-service repository Cargo.lock using cargo-bitbake tool
SRC_URI += " \
crate://crates.io/aho-corasick/0.7.15 \
crate://crates.io/ansi_term/0.11.0 \
crate://crates.io/anyhow/1.0.38 \
crate://crates.io/atty/0.2.14 \
crate://crates.io/autocfg/1.0.1 \
crate://crates.io/base64/0.12.3 \
crate://crates.io/base64/0.13.0 \
crate://crates.io/bincode/1.3.2 \
crate://crates.io/bindgen/0.56.0 \
crate://crates.io/bindgen/0.57.0 \
crate://crates.io/bitfield/0.13.2 \
crate://crates.io/bitflags/1.2.1 \
crate://crates.io/byteorder/1.3.4 \
crate://crates.io/bytes/0.5.6 \
crate://crates.io/bytes/1.0.1 \
crate://crates.io/cc/1.0.67 \
crate://crates.io/cexpr/0.4.0 \
crate://crates.io/cfg-if/1.0.0 \
crate://crates.io/clang-sys/1.1.1 \
crate://crates.io/clap/2.33.3 \
crate://crates.io/cmake/0.1.45 \
crate://crates.io/cryptoauthlib-sys/0.1.0 \
crate://crates.io/cryptoki-sys/0.1.1 \
crate://crates.io/cryptoki/0.1.1 \
crate://crates.io/derivative/2.2.0 \
crate://crates.io/either/1.6.1 \
crate://crates.io/enumflags2/0.6.4 \
crate://crates.io/enumflags2_derive/0.6.4 \
crate://crates.io/env_logger/0.8.3 \
crate://crates.io/fixedbitset/0.2.0 \
crate://crates.io/getrandom/0.2.2 \
crate://crates.io/glob/0.3.0 \
crate://crates.io/hashbrown/0.9.1 \
crate://crates.io/heck/0.3.2 \
crate://crates.io/hermit-abi/0.1.18 \
crate://crates.io/hex/0.4.3 \
crate://crates.io/hostname-validator/1.0.0 \
crate://crates.io/humantime/2.1.0 \
crate://crates.io/indexmap/1.6.2 \
crate://crates.io/itertools/0.8.2 \
crate://crates.io/itertools/0.9.0 \
crate://crates.io/lazy_static/1.4.0 \
crate://crates.io/lazycell/1.3.0 \
crate://crates.io/libc/0.2.89 \
crate://crates.io/libloading/0.7.0 \
crate://crates.io/log/0.4.14 \
crate://crates.io/mbox/0.5.0 \
crate://crates.io/memchr/2.3.4 \
crate://crates.io/multimap/0.8.3 \
crate://crates.io/nom/5.1.2 \
crate://crates.io/num-bigint/0.3.2 \
crate://crates.io/num-complex/0.3.1 \
crate://crates.io/num-derive/0.3.3 \
crate://crates.io/num-integer/0.1.44 \
crate://crates.io/num-iter/0.1.42 \
crate://crates.io/num-rational/0.3.2 \
crate://crates.io/num-traits/0.2.14 \
crate://crates.io/num/0.3.1 \
crate://crates.io/num_cpus/1.13.0 \
crate://crates.io/oid/0.1.1 \
crate://crates.io/parsec-interface/0.24.0 \
crate://crates.io/peeking_take_while/0.1.2 \
crate://crates.io/petgraph/0.5.1 \
crate://crates.io/picky-asn1-der/0.2.4 \
crate://crates.io/picky-asn1-x509/0.4.0 \
crate://crates.io/picky-asn1/0.3.1 \
crate://crates.io/pkg-config/0.3.19 \
crate://crates.io/ppv-lite86/0.2.10 \
crate://crates.io/proc-macro-error-attr/1.0.4 \
crate://crates.io/proc-macro-error/1.0.4 \
crate://crates.io/proc-macro2/1.0.24 \
crate://crates.io/prost-build/0.6.1 \
crate://crates.io/prost-build/0.7.0 \
crate://crates.io/prost-derive/0.6.1 \
crate://crates.io/prost-derive/0.7.0 \
crate://crates.io/prost-types/0.6.1 \
crate://crates.io/prost-types/0.7.0 \
crate://crates.io/prost/0.6.1 \
crate://crates.io/prost/0.7.0 \
crate://crates.io/psa-crypto-sys/0.8.0 \
crate://crates.io/psa-crypto/0.8.0 \
crate://crates.io/quote/1.0.9 \
crate://crates.io/rand/0.8.3 \
crate://crates.io/rand_chacha/0.3.0 \
crate://crates.io/rand_core/0.6.2 \
crate://crates.io/rand_hc/0.3.0 \
crate://crates.io/redox_syscall/0.2.5 \
crate://crates.io/regex-syntax/0.6.23 \
crate://crates.io/regex/1.4.5 \
crate://crates.io/remove_dir_all/0.5.3 \
crate://crates.io/rust-cryptoauthlib/0.1.0 \
crate://crates.io/rustc-hash/1.1.0 \
crate://crates.io/rustc_version/0.2.3 \
crate://crates.io/same-file/1.0.6 \
crate://crates.io/sd-notify/0.2.0 \
crate://crates.io/secrecy/0.7.0 \
crate://crates.io/semver-parser/0.7.0 \
crate://crates.io/semver/0.9.0 \
crate://crates.io/serde/1.0.124 \
crate://crates.io/serde_bytes/0.11.5 \
crate://crates.io/serde_derive/1.0.124 \
crate://crates.io/shlex/0.1.1 \
crate://crates.io/signal-hook-registry/1.3.0 \
crate://crates.io/signal-hook/0.3.7 \
crate://crates.io/stable_deref_trait/1.2.0 \
crate://crates.io/strsim/0.8.0 \
crate://crates.io/structopt-derive/0.4.14 \
crate://crates.io/structopt/0.3.21 \
crate://crates.io/strum_macros/0.19.4 \
crate://crates.io/syn/1.0.64 \
crate://crates.io/synstructure/0.12.4 \
crate://crates.io/tempfile/3.2.0 \
crate://crates.io/termcolor/1.1.2 \
crate://crates.io/textwrap/0.11.0 \
crate://crates.io/thiserror-impl/1.0.24 \
crate://crates.io/thiserror/1.0.24 \
crate://crates.io/threadpool/1.8.1 \
crate://crates.io/toml/0.5.8 \
crate://crates.io/tss-esapi-sys/0.1.0 \
crate://crates.io/tss-esapi/5.0.0 \
crate://crates.io/unicode-segmentation/1.7.1 \
crate://crates.io/unicode-width/0.1.8 \
crate://crates.io/unicode-xid/0.2.1 \
crate://crates.io/users/0.11.0 \
crate://crates.io/uuid/0.8.2 \
crate://crates.io/vec_map/0.8.2 \
crate://crates.io/version/3.0.0 \
crate://crates.io/version_check/0.9.3 \
crate://crates.io/walkdir/2.3.1 \
crate://crates.io/wasi/0.10.2+wasi-snapshot-preview1 \
crate://crates.io/which/3.1.1 \
crate://crates.io/which/4.0.2 \
crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \
crate://crates.io/winapi-util/0.1.5 \
crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \
crate://crates.io/winapi/0.3.9 \
crate://crates.io/zeroize/1.2.0 \
crate://crates.io/zeroize_derive/1.0.1 \
file://cryptoki.patch \
"
LIC_FILES_CHKSUM = " \
file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57 \
"

View File

@@ -0,0 +1,18 @@
SUMMARY = "Parsec Command Line Interface"
HOMEPAGE = "https://github.com/parallaxsecond/parsec-tool"
LICENSE = "Apache-2.0"
inherit cargo
SRC_URI += "crate://crates.io/parsec-tool/${PV} \
"
DEPENDS = "clang-native"
INSANE_SKIP_${PN} += "dev-deps"
do_install() {
install -d ${D}/${bindir}
install -m 755 "${B}/target/${TARGET_SYS}/release/parsec-tool" "${D}${bindir}/parsec-tool"
}
require parsec-tool_${PV}.inc

View File

@@ -0,0 +1,127 @@
# This file is created from parsec-tool repository Cargo.lock using cargo-bitbake tool
SRC_URI += " \
crate://crates.io/aho-corasick/0.7.15 \
crate://crates.io/ansi_term/0.11.0 \
crate://crates.io/ansi_term/0.12.1 \
crate://crates.io/anyhow/1.0.38 \
crate://crates.io/atty/0.2.14 \
crate://crates.io/autocfg/1.0.1 \
crate://crates.io/base64/0.13.0 \
crate://crates.io/bincode/1.3.1 \
crate://crates.io/bitflags/1.2.1 \
crate://crates.io/block-buffer/0.9.0 \
crate://crates.io/byteorder/1.4.2 \
crate://crates.io/bytes/0.5.6 \
crate://crates.io/cc/1.0.66 \
crate://crates.io/cfg-if/1.0.0 \
crate://crates.io/clap/2.33.3 \
crate://crates.io/clap/3.0.0-beta.2 \
crate://crates.io/clap_derive/3.0.0-beta.2 \
crate://crates.io/cmake/0.1.45 \
crate://crates.io/cpuid-bool/0.1.2 \
crate://crates.io/derivative/2.2.0 \
crate://crates.io/digest/0.9.0 \
crate://crates.io/either/1.6.1 \
crate://crates.io/env_logger/0.8.3 \
crate://crates.io/fixedbitset/0.2.0 \
crate://crates.io/form_urlencoded/1.0.0 \
crate://crates.io/generic-array/0.14.4 \
crate://crates.io/getrandom/0.2.2 \
crate://crates.io/hashbrown/0.9.1 \
crate://crates.io/heck/0.3.2 \
crate://crates.io/hermit-abi/0.1.18 \
crate://crates.io/humantime/2.1.0 \
crate://crates.io/idna/0.2.1 \
crate://crates.io/indexmap/1.6.1 \
crate://crates.io/itertools/0.8.2 \
crate://crates.io/lazy_static/1.4.0 \
crate://crates.io/libc/0.2.86 \
crate://crates.io/log/0.4.14 \
crate://crates.io/matches/0.1.8 \
crate://crates.io/memchr/2.3.4 \
crate://crates.io/multimap/0.8.2 \
crate://crates.io/num-bigint/0.3.1 \
crate://crates.io/num-complex/0.3.1 \
crate://crates.io/num-derive/0.3.3 \
crate://crates.io/num-integer/0.1.44 \
crate://crates.io/num-iter/0.1.42 \
crate://crates.io/num-rational/0.3.2 \
crate://crates.io/num-traits/0.2.14 \
crate://crates.io/num/0.3.1 \
crate://crates.io/oid/0.1.1 \
crate://crates.io/once_cell/1.5.2 \
crate://crates.io/opaque-debug/0.3.0 \
crate://crates.io/os_str_bytes/2.4.0 \
crate://crates.io/parsec-client/0.12.0 \
crate://crates.io/parsec-interface/0.24.0 \
crate://crates.io/pem/0.8.3 \
crate://crates.io/percent-encoding/2.1.0 \
crate://crates.io/petgraph/0.5.1 \
crate://crates.io/picky-asn1-der/0.2.4 \
crate://crates.io/picky-asn1/0.3.1 \
crate://crates.io/ppv-lite86/0.2.10 \
crate://crates.io/proc-macro-error-attr/1.0.4 \
crate://crates.io/proc-macro-error/1.0.4 \
crate://crates.io/proc-macro2/1.0.24 \
crate://crates.io/prost-build/0.6.1 \
crate://crates.io/prost-derive/0.6.1 \
crate://crates.io/prost-types/0.6.1 \
crate://crates.io/prost/0.6.1 \
crate://crates.io/psa-crypto-sys/0.8.0 \
crate://crates.io/psa-crypto/0.8.0 \
crate://crates.io/quote/1.0.9 \
crate://crates.io/rand/0.8.3 \
crate://crates.io/rand_chacha/0.3.0 \
crate://crates.io/rand_core/0.6.2 \
crate://crates.io/rand_hc/0.3.0 \
crate://crates.io/redox_syscall/0.2.5 \
crate://crates.io/regex-syntax/0.6.22 \
crate://crates.io/regex/1.4.3 \
crate://crates.io/remove_dir_all/0.5.3 \
crate://crates.io/same-file/1.0.6 \
crate://crates.io/secrecy/0.7.0 \
crate://crates.io/serde/1.0.123 \
crate://crates.io/serde_bytes/0.11.5 \
crate://crates.io/serde_derive/1.0.123 \
crate://crates.io/sha2/0.9.3 \
crate://crates.io/strsim/0.10.0 \
crate://crates.io/strsim/0.8.0 \
crate://crates.io/structopt-derive/0.4.14 \
crate://crates.io/structopt/0.3.21 \
crate://crates.io/syn/1.0.60 \
crate://crates.io/synstructure/0.12.4 \
crate://crates.io/tempfile/3.2.0 \
crate://crates.io/termcolor/1.1.2 \
crate://crates.io/textwrap/0.11.0 \
crate://crates.io/textwrap/0.12.1 \
crate://crates.io/thiserror-impl/1.0.23 \
crate://crates.io/thiserror/1.0.23 \
crate://crates.io/thread_local/1.1.3 \
crate://crates.io/tinyvec/1.1.1 \
crate://crates.io/tinyvec_macros/0.1.0 \
crate://crates.io/typenum/1.12.0 \
crate://crates.io/unicode-bidi/0.3.4 \
crate://crates.io/unicode-normalization/0.1.17 \
crate://crates.io/unicode-segmentation/1.7.1 \
crate://crates.io/unicode-width/0.1.8 \
crate://crates.io/unicode-xid/0.2.1 \
crate://crates.io/url/2.2.0 \
crate://crates.io/users/0.10.0 \
crate://crates.io/uuid/0.8.2 \
crate://crates.io/vec_map/0.8.2 \
crate://crates.io/version_check/0.9.2 \
crate://crates.io/walkdir/2.3.1 \
crate://crates.io/wasi/0.10.2+wasi-snapshot-preview1 \
crate://crates.io/which/3.1.1 \
crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \
crate://crates.io/winapi-util/0.1.5 \
crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \
crate://crates.io/winapi/0.3.9 \
crate://crates.io/zeroize/1.2.0 \
crate://crates.io/zeroize_derive/1.0.1 \
"
LIC_FILES_CHKSUM = " \
file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57 \
"