Set up meson build structure for silicon_creator crypto library Signed-off-by: Jade Philipoom <jadep@google.com>
diff --git a/sw/device/silicon_creator/lib/crypto/ecdsa-p256/meson.build b/sw/device/silicon_creator/lib/crypto/ecdsa-p256/meson.build new file mode 100644 index 0000000..94406a3 --- /dev/null +++ b/sw/device/silicon_creator/lib/crypto/ecdsa-p256/meson.build
@@ -0,0 +1,13 @@ +# Copyright lowRISC contributors. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +sw_lib_crypto_otbn_sources += { + 'p256': files( + 'p256.s' + ), + 'p256_ecdsa': files( + 'p256_ecdsa.s', + 'p256.s', + ), +}
diff --git a/sw/device/silicon_creator/lib/crypto/meson.build b/sw/device/silicon_creator/lib/crypto/meson.build new file mode 100644 index 0000000..e2ffb7c --- /dev/null +++ b/sw/device/silicon_creator/lib/crypto/meson.build
@@ -0,0 +1,110 @@ +# Copyright lowRISC contributors. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +# Build definitions for OTBN software +# +# OTBN software is built with a separate toolchain, which is called as an +# external target from Meson. All functionality to call the external toolchain +# is encapsulated in this build file; users only need to care about two +# dictionaries. +# +# To use an OTBN application in device software, use the sw_lib_crypto_otbn +# dictionary. For example, to add a dependency to an embeddable version of the +# barrett384 OTBN application, add the following variable to the list of +# dependencies: sw_lib_crypto_otbn['barrett384']['rv32embed_dependency'] +# +# The sw_lib_crypto_otbn dictionary has the following structure: +# sw_lib_crypto_otbn = { +# APPNAME: { +# 'elf': OTBN_ELF_FILE, +# 'rv32embed_lib': RV32_LIBRARY, +# 'rv32embed_dependency': DEPENDENCY_ON_RV32_LIBRARY, +# }} +# +# Note that application names must be unique across subdirectories. + +# All OTBN software is added to this dictionary and then built in one go. +sw_lib_crypto_otbn_sources = {} + +# All subdirectories add the objects they want to build to the +# sw_lib_crypto_otbn_sources dictionary. +subdir('ecdsa-p256') + +prog_otbn_build = meson.source_root() / 'util/otbn_build.py' + +otbn_build_command = [ + prog_env, + 'OTBN_AS=@0@'.format(prog_otbn_as), + 'OTBN_LD=@0@'.format(prog_otbn_ld), + 'RV32_TOOL_OBJCOPY=@0@'.format(prog_objcopy.path()), + 'RV32_TOOL_AS=@0@'.format(prog_as.path()), + 'RV32_TOOL_LD=@0@'.format(prog_ld.path()), + prog_python, + prog_otbn_build, + '--out-dir', + '@OUTDIR@', + '@INPUT@', +] +otbn_build_depend_files = [ + prog_otbn_as, + prog_otbn_ld, + prog_objcopy.path(), + prog_as.path(), + prog_ld.path(), + prog_otbn_build, +] + +# Note on variable naming below: Variables in meson are global, we hence prefix +# all variables with sw_lib_crypto_otbn as "our namespace". Variables which are meant to be +# local to this file are prefixed with `sw_lib_crypto_otbn__`. + +sw_lib_crypto_otbn = {} +foreach sw_lib_crypto_otbn__app_name, sw_lib_crypto_otbn__app_sources : sw_lib_crypto_otbn_sources + # Output files generated by the otbn_build.py script. + sw_lib_crypto_otbn__app_output_files = [ + sw_lib_crypto_otbn__app_name + '.rv32embed.o', + sw_lib_crypto_otbn__app_name + '.elf', + ] + + # Target calling otbn_build.py + sw_lib_crypto_otbn__target = custom_target( + 'sw_lib_crypto_otbn_apps_' + sw_lib_crypto_otbn__app_name + '_target', + input: sw_lib_crypto_otbn__app_sources, + output: sw_lib_crypto_otbn__app_output_files, + command: otbn_build_command, + depend_files: [otbn_build_depend_files,], + ) + + # A library containing the OTBN application in a form embeddable into device + # (Ibex) software (the *.rv32embed.o file). + sw_lib_crypto_otbn__embedded_lib = static_library( + sw_lib_crypto_otbn__app_name, + [sw_lib_crypto_otbn__target[0]] # == sw_lib_crypto_otbn__app_output_files[0], i.e. *.rv32embed.o + ) + + # A dependency on the application as embeddable library, to be used if + # device (Ibex) software wants to include an OTBN application in its binary. + sw_lib_crypto_otbn__dependency = declare_dependency( + link_with: sw_lib_crypto_otbn__embedded_lib, + ) + + sw_lib_crypto_otbn += { + sw_lib_crypto_otbn__app_name: { + 'elf': sw_lib_crypto_otbn__target[1], + 'rv32embed_lib': sw_lib_crypto_otbn__embedded_lib, + 'rv32embed_dependency': sw_lib_crypto_otbn__dependency, + } + } + + custom_target( + 'sw_lib_crypto_otbn_app_export_' + sw_lib_crypto_otbn__app_name, + command: export_target_command, + depend_files: [export_target_depend_files,], + input: [sw_lib_crypto_otbn__target[1]], + output: 'sw_lib_crypto_otbn_app_export_' + sw_lib_crypto_otbn__app_name, + build_always_stale: true, + build_by_default: true, + ) + +endforeach
diff --git a/sw/device/silicon_creator/lib/meson.build b/sw/device/silicon_creator/lib/meson.build index ce82910..f2c3c38 100644 --- a/sw/device/silicon_creator/lib/meson.build +++ b/sw/device/silicon_creator/lib/meson.build
@@ -3,6 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 subdir('base') subdir('drivers') +subdir('crypto') # Mask ROM fake dependencies. These are temporary dependencies until we # refactor or copy the other libraries we need (e.g. `runtime`).