首页 > 解决方案 > 嵌入式系统:数据大小管理(64 位主机向 32 位设备发送数据)

问题描述

我正在构建一个32 位嵌入式设备,外部参与者可以通过PKCS#11接口与之通信。

基本上有3个组件:

我正在开发设备和主机库,我现在的主要问题是确保与 32 位和 64 位主机应用程序的兼容性。

pkcs11t.h将CK_ULONG定义为:

/* an unsigned value, at least 32 bits long */
typedef unsigned long int CK_ULONG;

问题是long int主机(8 字节)和我们的设备(4 字节)上的大小不同。

我很想使用uint32_t而不是unsigned long int. 但标准规定如下:

因此,许多数据和指针类型在不同环境之间会有所不同(例如,CK_ULONG 有时是 32 位,有时可能是 64 位)。然而,这些细节不应该影响应用程序,假设它是使用与应用程序链接到的 Cryptoki 库一致的 Cryptoki 头文件编译的。

主机将向嵌入式设备发送请求,假设主机发送请求 ID 为0. 嵌入式设备如何知道它是 32 位还是 64 位值?

所以我的问题如下:在 32 位嵌入式设备中处理 64 位数据类型的最佳方法是什么?我在主机的图书馆里想着类似的东西:

CK_ULONG data = 0x42; // user input, could be anything

#ifdef HOST_64
assert(data <= 4294967295);
#endif

send_data_to_device((uint32_t)data);

但是感觉不对劲...

标签: cembeddedpkcs#11

解决方案


大概您的嵌入式设备执行服务。该服务需要一个接口。

您需要指定该接口。每个可用的命令、值、操作等都应与可接受的值范围以及错误条件下发生的情况一起记录。然后,您只需在双方都实施规范。

任何一方的位深度或数据类型都无关紧要。如果数据不符合接口要求,则必须在使用接口前进行转换。


推荐阅读