blog icon indicating copy to clipboard operation
blog copied to clipboard

My blog

Results 115 blog issues
Sort by recently updated
recently updated
newest added

I'd like to introduce the S32K3x4 EVB-Q257 Evaluation Board to you. The following images illustrate the board's apparent and onboard functional modules. ![](https://raw.githubusercontent.com/carloscn/images/main/typora202404231429618.png) ![](https://raw.githubusercontent.com/carloscn/images/main/typora202404231429186.png) ![](https://raw.githubusercontent.com/carloscn/images/main/typora202404231429524.png) # 1. Hello World In...

Embedded
ARMv7
Cortex-M
NXP

## 目的 本文档旨在说明如何通过U-Boot Standalone 应用从SD卡读取配置文件(例如`boot.cfg`),解析该文件中的关键环境变量,并更新系统的启动参数。这种机制对于需要从外部介质动态更新启动配置的嵌入式系统特别有用,如在固件更新或启动时根据条件选择不同的启动流程。 ``` +------------------+ | Start | +------------------+ | v +-------------------------------+ | S1: Load `boot.cfg` from SD | +-------------------------------+ | v +---------------------------------------+ | S2: Parse boot_flag, hash,...

ARMv8
Linux
Embedded

OpenSSL offload 指的是将 OpenSSL 加密和解密任务从 CPU 转移到专用硬件上执行的过程。OpenSSL 是一个广泛使用的开源加密库,支持多种加密算法,用于保护网络通信的安全。在处理大量加密解密操作时,这些任务可能会消耗大量的 CPU 资源,影响系统的其他功能或增加服务器的负载。 通过使用加密卸载技术,例如使用支持硬件加速的专用加密卡或集成加速硬件的处理器,可以显著提高加密和解密操作的效率。这种方法可以减少 CPU 的负担,提高整体系统性能,尤其是在需要处理高强度加密操作的高性能计算环境或大规模数据中心中。 硬件加速器可以是专用的安全处理器、网络卡(提供 SSL/TLS 加速功能)、或者是集成了加密加速功能的 CPU。这些硬件通常设计有专门的算法(如 AES、RSA、SHA)加速引擎,能够在不影响主 CPU 性能的情况下,快速处理加密和解密任务。 OpenSSL offload 通过硬件来实现安全算法的加速,对于那些需要处理大量安全通信,同时希望优化资源使用和提高性能的场景特别有用。 本文以NXP的Layerscape为例子,来描述OpenSSL的offload的功能及NXP如何在Linux中和自己CAAM Driver进行结合。 # OpenSSL软件栈 OpenSSL可以通过其引擎接口将加密操作委托给各种硬件设备执行。建立在这个接口之上的是cryptodev引擎,它用于将加密操作卸载到由操作系统内核控制的硬件设备上。Cryptodev引擎最初为OpenBSD开发,后来通过多个驱动程序(如OCF和cryptodev-linux)将相同的API移植到了GNU/Linux操作系统上。 Cryptodev-linux是一个Linux内核驱动程序,通过设备文件/dev/crypto将内部加密API暴露给用户空间。用户空间应用通过ioctl系统调用请求Linux内核代表它们执行加密操作。Linux内核支持多种加密算法,并在CPU上运行软件实现。硬件加速器的驱动程序安装时具有更高的优先级,并且无需进一步配置即可覆盖软件实现。 从任何应用程序的角度来看,算法的最快实现是透明使用的。这种行为也传递给了cryptodev接口,该接口不知道算法是在CPU上运行还是在硬件加速器上运行。因此,确保在运行应用程序之前有可用的硬件内核驱动程序是应用操作员的责任。...

Embedded
LinuxKernel
LinuxDriver
Security
NXP

# [Linux] 简析Linux镜像生成过程 Linux镜像原始输出为vmlinux,后续可能已Image、Image.gz、uImage形式输出。具体过程如下: 1. 通过link-vmlinux.sh生成vmlinux和System.map文件。 2. 通过objcopy移除vmlinux中不必要段,输出binary格式Image。 3. 对Image进行压缩,输出不同格式的压缩文件,比如gzip对应的Image.gz。 4. 对Image.gz加上设备树及ramdisk,生成FIT格式的uImage文件。 ![image](https://github.com/carloscn/blog/assets/16836611/e340bc25-9702-4645-bbc1-4974297a426c) ## 1. 生成vmlinux和System.map 根目录Makefile生成.vmlinux.cmd: `cmd_vmlinux := /bin/bash scripts/link-vmlinux.sh aarch64-linux-gnu-ld -EL --no-undefined -X -pie -shared -Bsymbolic --no-apply-dynamic-relocs --fix-cortex-a53-843419...

Linux
LinuxKernel

# ls104x Provisioning Guideline !!!请严格按照本文步骤执行eFUSE的烧录(provisioning)。请每一步都要一个字一个字的读,不可以错过任何步骤,不可以越过任何的过程,即便你对一些过程已经熟悉。一个参数的错误都可能导致secure boot失败。 # 1. Provisioning Provisioning分为两个阶段: * 调试阶段:使用RCW来控制BootROM从mirror register读取SRKH; * 生产阶段:RCW控制失效,BootROM强制从eFUSE读取SRKH; 调试阶段是给我们提供一个SRKH烧录错误的,我们只是把SRKH烧录到[mirror registers](https://docs.nxp.com/bundle/GUID-487B2E69-BB19-42CB-AC38-7EF18C0FE3AE/page/GUID-2CF1D60F-C79F-4A35-800B-2BFE504EBAC5.html),并没有真正的烧录到eFUSE。只有烧[SFP_INGR register](https://docs.nxp.com/bundle/GUID-487B2E69-BB19-42CB-AC38-7EF18C0FE3AE/page/GUID-EFF8FF41-C8C0-4A3B-AF95-E801D585B7C6.html) 之后,mirror register的值会被打到eFUSE上,此时eFUSE不可以被烧录,也就是进入到生产阶段。 ## 1.1 调试阶段的Provisioning 烧录前提:需要一个非secure状态下编译的可以进入到uboot环境的firmware。 调试阶段的的Provisioning,需要烧录三个位置: * **OTPMK**:最先烧录的,这个是烧录到真正的eFUSE,没有mirror机制。 * **SRKH Mirror...

ARMv8
Embedded
NXP

# 1. 服务器端配置 本文使用HTTP而不是HTTPS,并且服务器使用本机HOST局域网更新。 ## 1.1 仓库配置 - 需要进行ostree仓库的初始化 - 需要在ostree仓库中增加busybox的rootfs文件 - **对rootfs文件进行部署标准化改造** - 需要commit仓库变化 - 需要生成summary文件 - 需要启动服务器监听程序 创建初始化仓库: `mkdir -p repo && ostree --repo=repo init --mode=archive-z2 && mkdir...

Linux
Embedded
NXP

本文来源于以下的文献,对其进行整理: * https://source.android.com/docs/security?hl=zh-cn * https://developer.android.com/quality/privacy-and-security * https://github.com/OWASP/owasp-mastg/blob/master/Document/0x02a-Frontispiece.md * https://mas.owasp.org/MASTG/Intro/0x01-Foreword/ * Book -- Android Security Internals An In-Depth Guide to Android's Security Architecture # 1. Android Security Arch ## 1.1 Security...

Security
Android

系统芯片(SoC,System on a Chip)的密钥管理机制对于确保整个系统的安全性至关重要。SoC通常是集成了多个功能模块(如处理器核心、内存、输入/输出控制等)的单个芯片,广泛应用于智能手机、平板电脑、嵌入式系统等设备中。SoC的密钥管理机制的重要性可以从以下几个方面来理解: 1. **数据保护**:SoC的密钥管理机制用于加密和解密数据,确保存储或传输的数据安全,防止敏感信息泄露。 2. **安全引导**:密钥管理机制可以用于实现安全引导过程,确保设备在启动时只加载和执行经过验证的、可信的软件。 3. **设备认证**:SoC可以利用密钥管理机制实现设备级别的身份认证,确保设备在网络或系统中的身份是合法和可信的。 4. **数字版权管理(DRM)**:在处理版权受保护的内容(如数字媒体内容)时,密钥管理机制用于实施DRM策略,防止非法复制和分发。 5. **安全通信**:密钥管理对于保障设备之间的安全通信至关重要,例如在进行加密通信或执行其他安全相关操作时。 6. **防止篡改和攻击**:有效的密钥管理机制可以帮助防止各种安全威胁,如篡改攻击、重放攻击等。 7. **合规性**:对于需要遵守特定安全标准和法规的应用(如金融服务、健康信息处理),密钥管理机制有助于确保合规。 8. **多样性和灵活性**:在复杂的应用场景中,密钥管理机制提供了处理多种安全需求的灵活性和扩展性。 SoC的密钥管理机制是确保整个系统安全、保护数据隐私和完整性、维护设备和网络的安全信任链的基础。在设计和实施SoC时,对密钥管理机制的考虑是至关重要的。 本文对一般的SoC中的key管理机制进行调研,并进行总结,并以NXP等著名的SoC为例,来作为Key管理的设计。 * Key种类 * Key管理 (存储or派生) * Key的使用场景 *...

ARMv8
Embedded
Security
ARMv7
Cortex-M

# 1. 背景 由于私钥和对称秘钥具有非常高的机密性,不允许泄露;公钥和证书则具有完整性要求,禁止未授权更改,因此,如何存储具有机密性的数据和完整性保护要求的数据,是一个严肃且重要的话题。在携带有硬件HSM、密码机或者是硬件HSE等硬件安全模块的设备上,由硬件安全模块提供对敏感数据的机密性保护和完整性保护。但是,对于一些不具备硬件安全模块的设备,同样需要对机密数据和完整性数据进行保护。幸运的是,TEE提供了安全存储的能力,能够为敏感数据提供机密性和完整性保护能力。 ![](https://raw.githubusercontent.com/carloscn/images/main/typora202312150942519.png) # 2. TEE的安全基础-- TrustZone TrustZone提供了一些基础的安全能力,基于这些安全能力,上层可以构建不同的安全机制,比如说TEE、Secure Boot等。其中,将内存分为安全内存和非安全内存是TrustZone的一项重要特性,其主要目的包括: 1. **隔离敏感数据:** TrustZone允许将敏感数据存储在安全内存中,而将非敏感数据存储在非安全内存中。这样,敏感数据在处理器的安全区域内受到保护,不容易被恶意软件或非授权的应用程序访问和泄露。 2. **执行安全代码:** 安全内存还用于存储安全性相关的代码,如加密和认证算法,以及安全启动代码。这些代码在非安全内存中不可见,从而提供了一种方式来执行和保护安全关键操作。 3. **隔离不受信任的应用:** 非安全内存用于存储不受信任的应用程序和操作系统组件。TrustZone通过硬件隔离确保这些应用程序和组件无法直接访问安全内存中的敏感数据或安全代码。 4. **防止侧信道攻击:** 通过将安全内存隔离,TrustZone有助于防止侧信道攻击,如缓存侧信道攻击和时序侧信道攻击,因为非安全的应用程序无法直接观察或干扰安全内存中的操作。 5. **提供硬件支持:** TrustZone利用ARM处理器的硬件支持,确保内存分区的强制执行。这是硬件级别的隔离,不容易被绕过。 具体参考,对于M核心: https://github.com/carloscn/blog/issues/197 (这里只是写trustzone的意义,更多的用的是A核) ##...

ARMv8
Linux
Security

### 变量定义的位置 在C语言中,变量的定义位置取决于编码风格和标准。在C89(ANSI C)标准中,要求在函数的开始部分声明所有变量。但在C99及之后的标准中,允许在需要时在函数内任何位置声明变量。 #### C89标准 在C89标凈中,所有变量必须在函数的任何执行语句之前定义。这意味着所有的变量声明都应该在函数的开始部分,通常是在任何逻辑或计算操作之前。 ```C #include int main(void) { int ret = 0; int a = 9, b = 0, c = 7, d = 6; a...

ARMv8
GCC