openwsn-berkeley / lakers

EDHOC implemented in Rust, optimized for microcontrollers, with bindings for C and Python.
https://crates.io/crates/lakers
BSD 3-Clause "New" or "Revised" License
12 stars 10 forks source link

Trying to use vanilla psa wrapper #159

Open geonnave opened 7 months ago

geonnave commented 7 months ago

The approach is twofold:

  1. Avoid depending on point compression on psa side, since the PSA API seems to not support compressed points.
  2. Use a newly patched crypto-psa that only has patches for no-std and baremetal features (no patches at the mbedtls level). I hope to be able to merge that upstream, so that we can use the vanilla psa wrapper.

Reasoning behind this PR:

Edit: possible upstream no-std feature for crypto-psa tracked here.

geonnave commented 7 months ago

Oh, I was too happy when the local tests passed, but the actual compilation for the embedded target failed. Seems to be an issue with building mbedtls.

geonnave commented 7 months ago

Good news -- I was able to compile and run on the nRF52840.

Bad news -- mbedtls still requires a patch to build correctly in the way we want to use it:

diff --git a/scripts/config.py b/scripts/config.py
index 6d5edc7c0..36312df04 100755
--- a/scripts/config.py
+++ b/scripts/config.py
@@ -241,6 +241,7 @@ def full_adapter(name, active, section):
 # need to be repeated here.
 EXCLUDE_FROM_BAREMETAL = frozenset([
     #pylint: disable=line-too-long
+    'MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS',
     'MBEDTLS_ENTROPY_NV_SEED', # requires a filesystem and FS_IO or alternate NV seed hooks
     'MBEDTLS_FS_IO', # requires a filesystem
     'MBEDTLS_HAVE_TIME', # requires a clock
@@ -270,6 +271,20 @@ def baremetal_adapter(name, active, section):
     if name == 'MBEDTLS_NO_PLATFORM_ENTROPY':
         # No OS-provided entropy source
         return True
+    if name == 'MBEDTLS_ENTROPY_HARDWARE_ALT':
+        # Custom entropy source provided
+        return True
+    if name == 'MBEDTLS_ENTROPY_FORCE_SHA256':
+        # Force SHA-256 accumulator
+        return True
+    if name == 'MBEDTLS_MEMORY_BUFFER_ALLOC_C':
+        return True
+    if name == 'MBEDTLS_PLATFORM_C':
+        return True
+    if name == 'MBEDTLS_PLATFORM_MEMORY':
+        return True
+    if name == 'MBEDTLS_PLATFORM_NO_STD_FUNCTIONS':
+        return True
     return include_in_full(name) and keep_in_baremetal(name)

 def include_in_crypto(name):