#iot #security #edhoc #protocols #crypto #no-alloc

无 std lakers

EDHOC (RFC 9528) 的实现

8 个版本

0.6.2 2024 年 6 月 24 日
0.6.1 2024 年 6 月 22 日
0.6.0 2024 年 5 月 17 日
0.5.1 2024 年 3 月 5 日
0.4.1 2023 年 12 月 12 日

#163 in 网络编程

Download history 172/week @ 2024-05-03 250/week @ 2024-05-10 246/week @ 2024-05-17 190/week @ 2024-05-24 43/week @ 2024-05-31 45/week @ 2024-06-07 127/week @ 2024-06-14 498/week @ 2024-06-21 319/week @ 2024-06-28 539/week @ 2024-07-05 195/week @ 2024-07-12 27/week @ 2024-07-19 60/week @ 2024-07-26 215/week @ 2024-08-02 30/week @ 2024-08-09 207/week @ 2024-08-16

514 每月下载量

BSD-3-Clause

145KB
3K SLoC

lakers ─ CI 状态 最新版本 API 文档

Rust 中的 EDHOC (RFC 9528) 实现

什么是 EDHOC?

EDHOC(在 COSE 上使用短暂 Diffie-Hellman)是 IETF 的一项新标准,它提供了一个非常轻量级的认证密钥交换,非常适合在受限制的环境中使用,例如物联网环境。

EDHOC 特性

  • 轻量级:完整认证密钥交换仅需 101 字节
  • 安全:双向认证、前向安全和身份保护
  • 传输无关:可以在有或没有 IP 连接的场景中使用;传输 EDHOC 的常用方法是 通过可靠的 CoAP
  • 代码重用:由于在物联网场景中常用的技术(如 COSE、CBOR 和 CoAP)的重用而实现
  • 最后,EDHOC 的主要用途是建立 OSCORE 安全上下文

lakers 特性

  • 易于使用的类型声明 API,适用于发起者和响应者
  • 微控制器优化:无 std,无堆分配,零依赖(除了加密后端之外)
  • 可配置的加密后端
  • C 和 Python 绑定
  • 支持 EDHOC 扩展,包括 零接触授权

它目前支持认证模式 STAT-STAT 和密码套件 2(AES-CCM-16-64-128、SHA-256、8、P-256、ES256、AES-CCM-16-64-128、SHA-256)。

入门指南

要在您的Rust项目中使用 lakers,请在Cargo.toml中添加它,使用以下命令:cargo add lakers

以下是Initiator角色的API快速预览(对于Responder角色以及更多细节,请查看示例或单元测试)

// perform the handshake
let initiator = EdhocInitiator::new(default_crypto());

let (initiator, message_1) = initiator.prepare_message_1(None, &None)?; // c_i and ead_1 are set to None

let (initiator, _c_r, id_cred_r, _ead_2) = initiator.parse_message_2(&message_2)?;
let valid_cred_r = credential_check_or_fetch(Some(CRED_R), id_cred_r)?; // CRED_R contains Responder's public key
let initiator = initiator.verify_message_2(I, cred_i, valid_cred_r)?; // I is Initiator's private key

let (mut initiator, message_3, i_prk_out) = initiator.prepare_message_3(CredentialTransfer::ByReference, &None)?; // no ead_3

// derive a secret to use with OSCORE
let oscore_secret = initiator.edhoc_exporter(0u8, &[], 16); // label is 0

// update the prk_out key (context taken from draft-ietf-lake-traces)
let context = &[0xa0, 0x11, 0x58, 0xfd, 0xb8, 0x20, 0x89, 0x0c, 0xd6, 0xbe, 0x16, 0x96, 0x02, 0xb8, 0xbc, 0xea];
let prk_out_new = initiator.edhoc_key_update(context);

C API

C兼容的静态库和头文件可以在发布页面下载。

Python API

lakers-python可在PyPI上找到,要安装它,请运行pip install lakers-python

开发

要开发lakers本身,请按照以下说明操作

  1. 确保您已安装Rust

  2. 下载、编译并运行测试

git clone [email protected]:openwsn-berkeley/lakers.git && cd lakers
cargo build
cargo test

lakers可以根据启用的功能进行不同的配置。要了解有哪些可用功能以及如何为构建和测试的多个配置选择它们,请查看GitHub Actions文件

示例:在原生主机上使用CoAP的EDHOC

在一个终端中运行示例CoAP服务器

cargo run --bin coapserver

在另一个终端中运行客户端

cargo run --bin coapclient

在输出中,您应该找到EDHOC握手消息和派生的OSCORE密钥/盐。

这些示例的源代码位于examples/coap/src/bin

示例:在不同加密后端上的nRF52840设备上的EDHOC

要构建在nrf52840dk上运行的示例应用程序,请按以下步骤操作

# head to the example `no_std` example
cd ./examples/lakers-no_std

# build using the cryptocell310 crypto backend (hardware-accelerated)
cargo build --target="thumbv7em-none-eabihf" --release

# build using the psa crypto backend (software-based)
cargo build --target="thumbv7em-none-eabihf" --no-default-features --features="crypto-psa, ead-none, rtt" --release

构建并烧录到板子

  1. 安装cargo-embed
  2. 运行上述命令之一,但将build替换为embed。例如: cargo embed"thumbv7em-none-eabt class="pun-def pun-def-str">"

目录结构

此库结构为cargo workspace。其主要成员包括:

  • lib:提供EDHOC实现的库。
  • crypto:不同的加密后端(例如psa、cryptocell310、rustcrypto)。
  • ead:通过外部授权数据(EAD)字段实现EDHOC的扩展。
  • shared:定义在库成员中使用的共享结构和模块。
  • lakers-c:提供从C代码中使用lakers的外部函数接口。
  • lakers-python:用于在Python中使用lakers的API。
  • examples:演示如何使用库的示例应用程序。

依赖项

~87KB