Merge branch 'master' into fix-openssl
This commit is contained in:
3
.vscode/extensions.json
vendored
3
.vscode/extensions.json
vendored
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"davidanson.vscode-markdownlint",
|
||||
"rust-lang.rust"
|
||||
"rust-lang.rust",
|
||||
"ms-python.python"
|
||||
]
|
||||
}
|
||||
|
||||
15
.vscode/settings.json
vendored
15
.vscode/settings.json
vendored
@@ -1,7 +1,20 @@
|
||||
{
|
||||
"editor.detectIndentation": true,
|
||||
"editor.formatOnPaste": false,
|
||||
"editor.formatOnSave": true,
|
||||
"editor.formatOnType": true,
|
||||
"editor.insertSpaces": true,
|
||||
"editor.tabSize": 4,
|
||||
"rust-client.channel": "nightly",
|
||||
// The toolchain is updated from time to time so let's make sure that RLS is updated too
|
||||
"rust-client.updateOnStartup": true,
|
||||
"rust.clippy_preference": "on"
|
||||
"rust.clippy_preference": "on",
|
||||
// Try to make VSCode formating as close as possible to the Google style.
|
||||
"python.formatting.provider": "yapf",
|
||||
"python.formatting.yapfArgs": [
|
||||
"--style=chromium"
|
||||
],
|
||||
"[python]": {
|
||||
"editor.tabSize": 2
|
||||
},
|
||||
}
|
||||
|
||||
135
deploy.py
135
deploy.py
@@ -27,7 +27,6 @@ import subprocess
|
||||
import sys
|
||||
from tockloader import tab, tbfh, tockloader
|
||||
|
||||
|
||||
# This structure allows us in the future to also support out-of-tree boards.
|
||||
SUPPORTED_BOARDS = {
|
||||
"nrf52840_dk": "third_party/tock/boards/nordic/nrf52840dk",
|
||||
@@ -76,6 +75,7 @@ def info(msg):
|
||||
|
||||
|
||||
class RemoveConstAction(argparse.Action):
|
||||
|
||||
def __init__(self,
|
||||
option_strings,
|
||||
dest,
|
||||
@@ -109,6 +109,7 @@ class RemoveConstAction(argparse.Action):
|
||||
|
||||
|
||||
class OpenSKInstaller(object):
|
||||
|
||||
def __init__(self, args):
|
||||
colorama.init()
|
||||
self.args = args
|
||||
@@ -116,8 +117,7 @@ class OpenSKInstaller(object):
|
||||
self.tab_folder = os.path.join("target", "tab")
|
||||
# This is the filename that elf2tab command expects in order
|
||||
# to create a working TAB file.
|
||||
self.target_elf_filename = os.path.join(
|
||||
self.tab_folder, "cortex-m4.elf")
|
||||
self.target_elf_filename = os.path.join(self.tab_folder, "cortex-m4.elf")
|
||||
self.tockloader_default_args = argparse.Namespace(
|
||||
arch="cortex-m4",
|
||||
board=getattr(self.args, "board", "nrf52840"),
|
||||
@@ -154,11 +154,9 @@ class OpenSKInstaller(object):
|
||||
# empty value.
|
||||
target_toolchain.append('')
|
||||
current_version = self.checked_command_output(["rustc", "--version"])
|
||||
if not all(
|
||||
(target_toolchain[0] in current_version,
|
||||
if not all((target_toolchain[0] in current_version,
|
||||
target_toolchain[1] in current_version)):
|
||||
info("Updating rust toolchain to {}".format(
|
||||
"-".join(target_toolchain)))
|
||||
info("Updating rust toolchain to {}".format("-".join(target_toolchain)))
|
||||
# Need to update
|
||||
self.checked_command_output(
|
||||
["rustup", "install", target_toolchain_fullstring])
|
||||
@@ -168,22 +166,17 @@ class OpenSKInstaller(object):
|
||||
|
||||
def build_and_install_tockos(self):
|
||||
self.checked_command_output(
|
||||
["make", "-C", SUPPORTED_BOARDS[self.args.board], "flash"]
|
||||
)
|
||||
["make", "-C", SUPPORTED_BOARDS[self.args.board], "flash"])
|
||||
|
||||
def build_and_install_example(self):
|
||||
assert (self.args.application)
|
||||
self.checked_command_output([
|
||||
"cargo",
|
||||
"build",
|
||||
"--release",
|
||||
"--target=thumbv7em-none-eabi",
|
||||
"--features={}".format(",".join(self.args.features)),
|
||||
"--example",
|
||||
"cargo", "build", "--release", "--target=thumbv7em-none-eabi",
|
||||
"--features={}".format(",".join(self.args.features)), "--example",
|
||||
self.args.application
|
||||
])
|
||||
self.install_elf_file(os.path.join(
|
||||
"target/thumbv7em-none-eabi/release/examples",
|
||||
self.install_elf_file(
|
||||
os.path.join("target/thumbv7em-none-eabi/release/examples",
|
||||
self.args.application))
|
||||
|
||||
def build_and_install_opensk(self):
|
||||
@@ -196,8 +189,9 @@ class OpenSKInstaller(object):
|
||||
"--target=thumbv7em-none-eabi",
|
||||
"--features={}".format(",".join(self.args.features)),
|
||||
])
|
||||
self.install_elf_file(os.path.join(
|
||||
"target/thumbv7em-none-eabi/release", self.args.application))
|
||||
self.install_elf_file(
|
||||
os.path.join("target/thumbv7em-none-eabi/release",
|
||||
self.args.application))
|
||||
|
||||
def generate_crypto_materials(self, force_regenerate):
|
||||
has_error = subprocess.call([
|
||||
@@ -205,35 +199,27 @@ class OpenSKInstaller(object):
|
||||
"Y" if force_regenerate else "N",
|
||||
])
|
||||
if has_error:
|
||||
error((
|
||||
"Something went wrong while trying to generate ECC "
|
||||
error(("Something went wrong while trying to generate ECC "
|
||||
"key and/or certificate for OpenSK"))
|
||||
|
||||
def install_elf_file(self, elf_path):
|
||||
assert (self.args.application)
|
||||
package_parameter = "-n"
|
||||
elf2tab_ver = self.checked_command_output(
|
||||
["elf2tab", "--version"]).split(' ', maxsplit=1)[1]
|
||||
elf2tab_ver = self.checked_command_output(["elf2tab", "--version"]).split(
|
||||
' ', maxsplit=1)[1]
|
||||
# Starting from v0.5.0-dev the parameter changed.
|
||||
# Current pyblished crate is 0.4.0 but we don't want developers
|
||||
# running the HEAD from github to be stuck
|
||||
if "0.5.0-dev" in elf2tab_ver:
|
||||
package_parameter = "--package-name"
|
||||
os.makedirs(self.tab_folder, exist_ok=True)
|
||||
tab_filename = os.path.join(
|
||||
self.tab_folder,
|
||||
tab_filename = os.path.join(self.tab_folder,
|
||||
"{}.tab".format(self.args.application))
|
||||
shutil.copyfile(elf_path, self.target_elf_filename)
|
||||
self.checked_command_output([
|
||||
"elf2tab",
|
||||
package_parameter,
|
||||
self.args.application,
|
||||
"-o",
|
||||
tab_filename,
|
||||
self.target_elf_filename,
|
||||
"--stack={}".format(STACK_SIZE),
|
||||
"--app-heap={}".format(APP_HEAP_SIZE),
|
||||
"--kernel-heap=1024",
|
||||
"elf2tab", package_parameter, self.args.application, "-o", tab_filename,
|
||||
self.target_elf_filename, "--stack={}".format(STACK_SIZE),
|
||||
"--app-heap={}".format(APP_HEAP_SIZE), "--kernel-heap=1024",
|
||||
"--protected-region-size=64"
|
||||
])
|
||||
self.install_padding()
|
||||
@@ -243,13 +229,11 @@ class OpenSKInstaller(object):
|
||||
setattr(args, "erase", self.args.clear_apps)
|
||||
setattr(args, "make", False)
|
||||
setattr(args, "no_replace", False)
|
||||
setattr(args, "sticky", False)
|
||||
tock = tockloader.TockLoader(args)
|
||||
tock.open(args)
|
||||
tabs = [tab.TAB(tab_filename)]
|
||||
try:
|
||||
tock.install(tabs, replace="yes",
|
||||
erase=args.erase, sticky=args.sticky)
|
||||
tock.install(tabs, replace="yes", erase=args.erase)
|
||||
except tockloader.exceptions.TockLoaderException as e:
|
||||
fatal("Couldn't install Tock application {}: {}".format(
|
||||
self.args.application, str(e)))
|
||||
@@ -284,16 +268,26 @@ class OpenSKInstaller(object):
|
||||
info(("A non-critical error occured while erasing "
|
||||
"apps: {}".format(str(e))))
|
||||
|
||||
def verify_flashed_app(self, expected_app):
|
||||
args = copy.copy(self.tockloader_default_args)
|
||||
tock = tockloader.TockLoader(args)
|
||||
app_found = False
|
||||
with tock._start_communication_with_board():
|
||||
apps = [app.name for app in tock._extract_all_app_headers()]
|
||||
app_found = expected_app in apps
|
||||
return app_found
|
||||
|
||||
def run(self):
|
||||
if self.args.action is None:
|
||||
# Nothing to do
|
||||
return
|
||||
return 0
|
||||
|
||||
self.update_rustc_if_needed()
|
||||
|
||||
if self.args.action == "os":
|
||||
info("Installing Tock on board {}".format(self.args.board))
|
||||
self.build_and_install_tockos()
|
||||
return 0
|
||||
|
||||
if self.args.action == "app":
|
||||
if self.args.application is None:
|
||||
@@ -305,6 +299,12 @@ class OpenSKInstaller(object):
|
||||
self.build_and_install_opensk()
|
||||
else:
|
||||
self.build_and_install_example()
|
||||
if self.verify_flashed_app(self.args.application):
|
||||
info("You're all set!")
|
||||
return 0
|
||||
error(("It seems that something went wrong. "
|
||||
"App/example not found on your board."))
|
||||
return 1
|
||||
|
||||
|
||||
def main(args):
|
||||
@@ -325,28 +325,21 @@ if __name__ == '__main__':
|
||||
action="store_false",
|
||||
default=True,
|
||||
dest="clear_apps",
|
||||
help=(
|
||||
"When installing an application, previously installed "
|
||||
"applications won't be erased from the board."
|
||||
),
|
||||
help=("When installing an application, previously installed "
|
||||
"applications won't be erased from the board."),
|
||||
)
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
commands = parser.add_subparsers(
|
||||
dest="action",
|
||||
help=(
|
||||
"Indicates which part of the firmware should be compiled and "
|
||||
"flashed to the connected board."
|
||||
)
|
||||
)
|
||||
help=("Indicates which part of the firmware should be compiled and "
|
||||
"flashed to the connected board."))
|
||||
|
||||
os_commands = commands.add_parser(
|
||||
"os",
|
||||
parents=[shared_parser],
|
||||
help=(
|
||||
"Compiles and installs Tock OS. The target board must be "
|
||||
"specified by setting the --board argument."
|
||||
),
|
||||
help=("Compiles and installs Tock OS. The target board must be "
|
||||
"specified by setting the --board argument."),
|
||||
)
|
||||
os_commands.add_argument(
|
||||
"--board",
|
||||
@@ -354,57 +347,47 @@ if __name__ == '__main__':
|
||||
dest="board",
|
||||
choices=get_supported_boards(),
|
||||
help="Indicates which board Tock OS will be compiled for.",
|
||||
required=True
|
||||
)
|
||||
required=True)
|
||||
|
||||
app_commands = commands.add_parser(
|
||||
"app",
|
||||
parents=[shared_parser],
|
||||
help="compiles and installs an application."
|
||||
)
|
||||
help="compiles and installs an application.")
|
||||
app_commands.add_argument(
|
||||
"--panic-console",
|
||||
action="append_const",
|
||||
const="panic_console",
|
||||
dest="features",
|
||||
help=(
|
||||
"In case of application panic, the console will be used to "
|
||||
help=("In case of application panic, the console will be used to "
|
||||
"output messages before starting blinking the LEDs on the "
|
||||
"board."
|
||||
),
|
||||
"board."),
|
||||
)
|
||||
app_commands.add_argument(
|
||||
"--no-u2f",
|
||||
action=RemoveConstAction,
|
||||
const="with_ctap1",
|
||||
dest="features",
|
||||
help=(
|
||||
"Compiles the OpenSK application without backward compatible "
|
||||
"support for U2F/CTAP1 protocol."
|
||||
),
|
||||
help=("Compiles the OpenSK application without backward compatible "
|
||||
"support for U2F/CTAP1 protocol."),
|
||||
)
|
||||
app_commands.add_argument(
|
||||
"--regen-keys",
|
||||
action="store_true",
|
||||
default=False,
|
||||
dest="regenerate_keys",
|
||||
help=(
|
||||
"Forces the generation of files (certificates and private keys) "
|
||||
help=("Forces the generation of files (certificates and private keys) "
|
||||
"under the crypto_data/ directory. "
|
||||
"This is useful to allow flashing multiple OpenSK authenticators "
|
||||
"in a row without them being considered clones."
|
||||
),
|
||||
"in a row without them being considered clones."),
|
||||
)
|
||||
app_commands.add_argument(
|
||||
"--debug",
|
||||
action="append_const",
|
||||
const="debug_ctap",
|
||||
dest="features",
|
||||
help=(
|
||||
"Compiles and installs the OpenSK application in debug mode "
|
||||
help=("Compiles and installs the OpenSK application in debug mode "
|
||||
"(i.e. more debug messages will be sent over the console port "
|
||||
"such as hexdumps of packets)."
|
||||
),
|
||||
"such as hexdumps of packets)."),
|
||||
)
|
||||
apps = app_commands.add_mutually_exclusive_group()
|
||||
apps.add_argument(
|
||||
@@ -412,18 +395,14 @@ if __name__ == '__main__':
|
||||
dest="application",
|
||||
action="store_const",
|
||||
const="ctap2",
|
||||
help="Compiles and installs the OpenSK application."
|
||||
)
|
||||
help="Compiles and installs the OpenSK application.")
|
||||
apps.add_argument(
|
||||
"--crypto_bench",
|
||||
dest="application",
|
||||
action="store_const",
|
||||
const="crypto_bench",
|
||||
help=(
|
||||
"Compiles and installs the crypto_bench example that tests "
|
||||
"the performance of the cryptographic algorithms on the board."
|
||||
)
|
||||
)
|
||||
help=("Compiles and installs the crypto_bench example that tests "
|
||||
"the performance of the cryptographic algorithms on the board."))
|
||||
|
||||
app_commands.set_defaults(features=["with_ctap1"])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user